Розглянемо детальніше, яким чином метод обмінюється інформацією з кодом, що викликав його. При виклику методу виконуються наступні дії:
1. Обчислюються вирази, що стоять на місці аргументів.
2. Виділяється пам'ять під параметри методу відповідно до їх типу.
3. Кожному з параметрів зіставляється відповідний аргумент (аргументи ніби накладаються на параметри і заміщають їх).
4. Виконується тіло методу.
5. Якщо метод повертає значення, воно передається в точку виклику; якщо метод має тип void, управління передається на оператора, наступного після виклику.
При цьому перевіряється відповідність типів аргументів і параметрів і при необхідності виконується їх перетворення. При невідповідності типів видається діагностичне повідомлення. Лістинг 5.3 ілюструє цей процес.
Лістинг 5.3. Передача параметрів методу
using System;
namespace ConsoleApplicationl
{
class Class1
{
static int Max(int a, int b)
{
if (a>b) return a;
return b;
}
static void Main( )
{
int a = 2, b = 4;
int x = Max( a, b ); // виклик методу Max
Console.WriteLine(x); // результат: 4
short tl =3, t2 = 4;
int у = Max( tl , t2 ); // виклик методу Max
Console.WriteLine(у); // результат: 4
int z = Max( a + tl, tl / 2 * b); // виклик методу Max
Console.WriteLine(z ); // результат: 5
}
}
}
У класі описаний метод Мах, який вибирає найбільше з двох переданих йому значень. Параметри описані як а і b. У методі Main виконуються три виклики Мах. В результаті першого виклику методу Мах передаються два аргументи того ж типу, що і параметри, в другому виклику - аргументи сумісного типу, в третьому - вирази.
Головна вимога при передачі параметрів полягає в тому, що аргументи при виклику методу повинні записуватися в тому ж порядку, що і в заголовку методу, і повинне існувати неявне перетворення типу кожного аргументу до типу відповідного параметра.
Кількість аргументів повинна відповідати кількості параметрів. На імена ніяких обмежень не накладаються: імена аргументів можуть як збігатися, так і не збігатися з іменами параметрів.
Існують два способи передачі параметрів: за значенням і по посиланню.
При передачі за значенням метод отримує копії значень аргументів, і оператори методу працюють з цими копіями. Доступу до початкових значень аргументів у методу немає, а отже, немає і можливості їх змінити.
При передачі по посиланню (за адресою) метод отримує копії адреси аргументів, він здійснює доступ до елементів пам'яті за цими адресами і може змінювати початкові значення аргументів, модифікуючи параметри.
Для обміну даними між функціями, що викликаються, передбачено чотири параметри:
§ параметри-значення;
§ параметри-посилання - описуються за допомогою ключового слова ref;
§ вихідні параметри - описуються за допомогою ключового слова out;
§ параметри-масиви - описуються за допомогою ключового слова params.
Ключове слово стоїть перед описом типу параметра. Якщо воно відсутнє, параметр вважається за параметр-значення. Параметр-масив може бути тільки один і повинен знаходитися останнім в списку, наприклад:
public int Calculate( int a, ref int b, out int c, params int[] d ) ...
Параметри-масиви будуть розглянуті в розділі 7, а зараз розглянемо решту типів параметрів.