Підрозділ 2.16
Методи
Пояснює методи як іменовані блоки коду, їх оголошення, виклик, скорочений синтаксис і роль у структуруванні програми.
2.16. Методи
Якщо змінна зберігає значення, то метод зберігає поведінку — іменований блок коду, що виконує певні дії. Методи дозволяють структурувати програму: замість того щоб копіювати одну й ту саму логіку в різних місцях, її записують один раз у методі, а потім викликають скільки завгодно разів звідусіль.
Насправді методи вже зустрічалися нам із самого початку: Console.WriteLine() — це метод, визначений у класі Console. Тепер розглянемо, як створювати власні методи.
Синтаксис визначення методу
Загальний синтаксис оголошення методу такий:
[модифікатори] тип_результату НазваМетоду([параметри])
{
// тіло методу
}
- Тип результату — тип значення, яке метод повертає після виконання. Якщо метод нічого не повертає, вказується
void. - Назва методу — ідентифікатор за тими самими правилами, що й назви змінних. За угодою C# методи іменуються з великої літери (PascalCase):
PrintDiagnosis,GetPatientAge,RegisterVisit. - Параметри — вхідні дані, які метод отримує при виклику (розглядаються в розділі 2.17). Якщо параметрів немає — дужки залишаються порожніми.
- Тіло — блок інструкцій у фігурних дужках, що виконуються при кожному виклику методу.
- Модифікатори необов'язкові; їх призначення розглядається в наступних розділах при вивченні класів і ООП.
Метод типу void
Найпростіший варіант — метод, що виконує дії, але нічого не повертає. Тип результату для таких методів — void:
Тут PrintWelcome — метод без параметрів і без значення, що повертається. У його тілі дві інструкції виведення. Виклик PrintWelcome() виконує обидві.
Важливо: визначення методу (блок коду з іменем і тілом) не виконує його автоматично. Для виконання необхідний виклик — рядок із назвою методу та круглими дужками.
Виклик методів
Для виклику методу вказується його назва та круглі дужки зі значеннями параметрів (якщо вони є). Якщо параметрів немає — дужки залишаються порожніми:
НазваМетоду();Головна перевага методів — повторне використання: один і той самий метод можна викликати будь-яку кількість разів у будь-якому місці програми:
Зверніть увагу: PrintHeader сам викликає PrintSeparator двічі всередині свого тіла. Методи можуть викликати інші методи — це дозволяє ієрархічно структурувати код.
Порядок розташування визначення методу та його виклику не має значення: виклик може передувати визначенню, і програма все одно спрацює коректно. Компілятор C# аналізує весь файл перед виконанням, тому всі методи відомі йому ще до того, як до них доходить виконання.
Кілька методів із умовним вибором
Програма може оголошувати будь-яку кількість методів і викликати потрібний залежно від умови. Це дозволяє чітко розподілити відповідальність між різними ділянками коду:
Кожен метод відповідає за одну конкретну дію — виведення відповідного повідомлення. Логіка вибору знаходиться окремо, у конструкції if...else. Такий розподіл спрощує читання та подальше редагування: щоб змінити текст попередження, достатньо відредагувати лише один метод, не торкаючись логіки вибору. Цей принцип — кожен метод відповідає лише за одну річ — є одним із фундаментальних у проектуванні програм.
Скорочений запис методу (вираз-тіло)
Якщо тіло методу складається лише з однієї інструкції, його можна записати у скороченій формі через оператор =>:
тип_результату НазваМетоду([параметри]) => інструкція;Повна і скорочена форми є точними еквівалентами з погляду компілятора:
Скорочений запис => (вираз-тіло, або expression-bodied member) зустрічається у коді C# дуже часто. Він є синтаксичним цукром — не змінює поведінку методу, лише скорочує запис. Застосовується тоді, коли метод концептуально простий і однорядковий запис не знижує читабельності.
Коли тіло методу складається з кількох інструкцій — завжди використовуйте повну форму з фігурними дужками. Спроба вмістити кілька інструкцій у стрілкову форму є синтаксичною помилкою.