Підрозділ 2.17
Параметри методів
Розглядає параметри методів, необов'язкові та іменовані параметри, порядок передачі аргументів і приклади викликів.
2.17. Параметри методів
Метод без параметрів завжди виконує одне й те саме: виводить один і той самий рядок або виконує фіксовану дію. Щоб метод міг працювати з різними даними, йому передають параметри — вхідні значення, що надходять ззовні під час виклику. Саме параметри роблять методи гнучкими й придатними для повторного використання.

Синтаксис параметрів
Параметри оголошуються у круглих дужках після назви методу через кому. Кожен параметр складається з типу та імені:
тип_результату НазваМетоду(тип1 параметр1, тип2 параметр2, ...)
{
// тіло
}Наприклад, метод реєстрації пацієнта, що приймає ім'я та вік:
Метод RegisterPatient має два параметри: name типу string та age типу int. При кожному виклику він отримує нові значення та виводить рядок із ними. Один і той самий метод, три різних результати.
Формальні та фактичні параметри (аргументи)
У C# використовуються два терміни для позначення параметрів:
- Формальні параметри — імена та типи, що оголошуються у визначенні методу. У прикладі вище —
nameтаage. Вони існують лише всередині тіла методу. - Фактичні параметри (аргументи) — конкретні значення, що передаються при виклику. У виклику
RegisterPatient("Іван Петренко", 45)аргументами є рядок"Іван Петренко"та ціле число45.
При виклику аргументи передаються параметрам за позицією — зліва направо у порядку, в якому вони оголошені. Перший аргумент стає першим параметром, другий — другим тощо.
Аргументами можуть бути не тільки літерали, а й змінні та складні вирази:
Аргументом bp - 100 є результат арифметичного виразу — компілятор обчислює його значення перед передачею в метод.
Якщо як аргумент передається змінна, вона повинна мати значення на момент виклику. Передача неініціалізованої змінної є помилкою компіляції.
Відповідність типів
Кожен аргумент повинен відповідати типу відповідного формального параметра або допускати неявне перетворення до нього. Компілятор перевіряє це ще до виконання програми:
Типи byte, short, int є числами різного розміру: byte вміщується в int, тому таке перетворення безпечне й автоматичне. Проте передати рядок замість числа або навпаки неможливо — компілятор виявить це одразу:
LogPressure(180, "P-003"); // ✗ Помилка: int і string поміняні місцямиНеобов'язкові параметри зі значенням за замовчуванням
За замовчуванням при виклику методу необхідно передати значення для кожного оголошеного параметра. Але іноді деякі параметри мають «розумне» значення за замовчуванням і передавати їх явно незручно. C# дозволяє оголошувати необов'язкові параметри: якщо аргумент не передано — використовується задане значення за замовчуванням:
Необов'язкові параметри завжди розташовуються після обов'язкових. Визначити обов'язковий параметр після необов'язкового неможливо — компілятор видасть помилку. Значення за замовчуванням повинне бути константним виразом: літерал, null, true/false або результат const-виразу.
Іменовані параметри
Зазвичай аргументи передаються за позицією — перший аргумент відповідає першому параметру. Але C# дозволяє передавати аргументи за іменем, явно вказуючи, якому параметру призначається значення. Синтаксис: ім'яПараметра: значення:
Іменована передача корисна у кількох ситуаціях:
- Пропуск необов'язкових параметрів. Якщо потрібно встановити лише деякі необов'язкові параметри, а не всі підряд — без іменування довелося б передавати значення за замовчуванням явно для кожного пропущеного параметра.
- Покращення читабельності. Запис
RegisterPatient(name: "Іван", age: 45)зрозуміліший, ніжRegisterPatient("Іван", 45)при читанні незнайомого коду. - Будь-який порядок. Іменовані аргументи можна передавати в довільному порядку, що іноді зручно логічно.
Важливе обмеження: після першого іменованого аргументу всі наступні теж повинні бути іменованими. Змішування позиційних і іменованих аргументів допустиме лише тоді, коли позиційні йдуть перед іменованими.