Параметри методів
У попередній темі було визначено метод SayHello, який виводить певне повідомлення в консоль:
void SayHello()
{
Console.WriteLine("Hello");
}
SayHello(); // Hello
Але недоліком такого методу є те, що він виводить одне й те саме повідомлення. Було б добре, якби ми могли динамічно визначати, яке повідомлення метод буде виводити на екран, тобто передавати це повідомлення ззовні до методу. Для цього в мові C# ми можемо використовувати параметри.
Параметри дозволяють передавати деякі вхідні дані до методу. Параметри визначаються через круглі дужки після назви методу у формі:
тип_повернення назва_методу (тип_параметра1 параметр1, тип_параметра2 параметр2, ...)
{
// дії методу
}
Визначення параметра має дві частини: спочатку йде тип параметра, а потім ім'я параметра.
Наприклад, давайте визначимо метод PrintMessage, який отримує повідомлення для виводу ззовні:
void PrintMessage(string message)
{
Console.WriteLine(message);
}
PrintMessage("Hello work"); // Hello work
PrintMessage("Hello METANIT.COM"); // Hello METANIT.COM
PrintMessage("Hello C#"); // Hello C#
Тут метод PrintMessage() приймає один параметр, який називається message і має тип string.
Для виконання методу, що має параметри, при виклику методу йому передаються значення для його параметрів у дужках після назви методу, наприклад:
PrintMessage("Hello work");
Тут рядок "Hello work" передається в параметр message. Значення, що передаються параметрам, також називаються аргументами. Тобто переданий рядок "Hello work" в цьому випадку є аргументом.
Іноді можна зустріти такі визначення як формальні параметри та фактичні параметри. Формальні параметри — це власне параметри методу (в даному випадку message), а фактичні параметри — це значення, які передаються формальним параметрам. Тобто фактичні параметри — це аргументи методу.
Давайте визначимо ще один метод, який додає два числа:
void Sum(int x, int y)
{
int result = x + y;
Console.WriteLine($"{x} + {y} = {result}");
}
Sum(10, 15); // 10 + 15 = 25
Метод Sum має два параметри: x і y. Обидва параметри представляють тип int. Тому при виклику цього методу ми повинні передати два числа на місце цих параметрів. Всередині методу обчислюється сума переданих чисел і виводиться на консоль.
Коли викликається метод Sum, значення передаються параметрам за позицією. Наприклад, у виклику Sum(10, 15) число 10 передається параметру x, а число 15 — параметру y.
Параметри також можуть використовуватися у скороченій версії методу:
void Sum(int x, int y) => Console.WriteLine($"{x} + {y} = {x + y}");
Sum(10, 15); // 10 + 15 = 25
Значення, що передаються параметрам, можуть представляти значення змінних або результат складних виразів, які повертають деяке значення:
void Sum(int x, int y) => Console.WriteLine($"{x} + {y} = {x + y}");
int a = 10, b = 15, c = 6;
Sum(a, b); // 10 + 15 = 25
Sum(3, c); // 3 + 6 = 9
Sum(14, 4 + c); // 14 + 10 = 24
Якщо параметрам методу передаються значення змінних, такі змінні повинні мати присвоєне значення. Наприклад, наступна програма не буде компілюватися:
void Sum(int x, int y)
{
Console.WriteLine($"{x} + {y} = {x + y}");
}
int a;
int b = 15;
Sum(a, b); // ! Помилка
Відповідність параметрів та аргументів за типом даних
При передачі значень параметрам важливо враховувати тип параметрів: між аргументами та параметрами має бути відповідність типів. Наприклад:
void PrintPerson(string name, int age)
{
Console.WriteLine($"Name: {name} Age: {age}");
}
PrintPerson("Tom", 24); // Name: Tom Age: 24
У цьому випадку перший параметр методу PrintPerson() представляє тип string, тому при виклику методу ми повинні передати цьому параметру значення типу string, тобто рядок. Другий параметр представляє тип int, тому ми повинні передати йому ціле число, що відповідає типу int.
PrintPerson("Tom", 24);
Ми також можемо передавати параметрам значення типів, які можуть бути автоматично перетворені до типу параметра. Наприклад:
void PrintPerson(string name, int age)
{
Console.WriteLine($"Name: {name} Age: {age}");
}
byte b = 37;
PrintPerson("Tom", b); // Name: Tom Age: 37
Тут параметру типу int передається значення типу byte, але компілятор може автоматично перетворити значення типу byte до типу int. Тому помилки тут не буде. Які перетворення типів можуть виконуватися автоматично, було розглянуто в одній з попередніх тем: Перетворення базових типів даних.
Ми не можемо передавати дані інших типів параметрам. Наприклад, наступний виклик методу PrintPerson буде некоректним:
PrintPerson(45, "Bob"); // Помилка! Невідповідність значень типам параметрів
Необов'язкові параметри
За замовчуванням при виклику методу необхідно вказати значення для всіх його параметрів. Але C# також дозволяє використовувати необов'язкові параметри. Для таких параметрів потрібно задати значення за замовчуванням. Також варто від значити, що після необов'язкових параметрів всі наступні параметри також повинні бути необов'язковими:
void PrintPerson(string name, int age = 1, string company = "Undefined")
{
Console.WriteLine($"Name: {name} Age: {age} Company: {company}");
}
Тут параметри age і company є необов'язковими, оскільки їм присвоєно значення. Тому при виклику методу ми можемо не передавати для них дані:
void PrintPerson(string name, int age = 1, string company = "Undefined")
{
Console.WriteLine($"Name: {name} Age: {age} Company: {company}");
}
PrintPerson("Tom", 37, "Microsoft"); // Name: Tom Age: 37 Company: Microsoft
PrintPerson("Tom", 37); // Name: Tom Age: 37 Company: Undefined
PrintPerson("Tom"); // Name: Tom Age: 1 Company: Undefined
Вивід на консоль програми:
Name: Tom Age: 37 Company: Microsoft
Name: Tom Age: 37 Company: Undefined
Name: Tom Age: 1 Company: Undefined
Іменовані параметри
У попередніх прикладах при виклику методів значення параметрам передавалися в тому порядку, в якому параметри були визначені в методі. Тобто аргументи передавалися параметрам за позицією. Але ми можемо порушити цей порядок, використовуючи іменовані параметри:
void PrintPerson(string name, int age = 1, string company = "Undefined")
{
Console.WriteLine($"Name: {name} Age: {age} Company: {company}");
}
PrintPerson("Tom", company: "Microsoft", age: 37); // Name: Tom Age: 37 Company: Microsoft
PrintPerson(age: 41, name: "Bob"); // Name: Bob Age: 41 Company: Undefined
PrintPerson(company: "Google", name: "Sam"); // Name: Sam Age: 1 Company: Google
Щоб передати значення параметрам за назвою, при виклику методу вказується ім'я параметра і його значення через двокрапку: name: "Tom".
Вивід на консоль програми:
Name: Tom Age: 37 Company: Microsoft
Name: Bob Age: 41 Company: Undefined
Name: Sam Age: 1 Company: Google