C#. Передача параметрів у методи

C#. Передача параметрів у методи

параметрів

Параметри методів

У цій статті доступно розповідається про особливості передачі параметрів у методи. Розглядається передача параметрів за значенням, за посиланням, так само чисто вихідні параметри. Зачіпаються нюанси роботи з типами значень та типами посилань.

Більшість програмістів стикається з необхідністю вивчення цієї теми, коли доводиться змінювати параметри, що передаються в методи (не використовувати їх значення для обчислення чогось, а саме змінювати значення, так, щоб ці зміни збереглися після виконання методу). І існує низка нюансів, які зовсім не очевидні для програміста-початківця.

За умовчанням, у мові програмування C#, аргументи методи передаються за значенням! Але, Ви повинні пам'ятати, що більшість типів, що використовуються програмістами, є все-таки типами посилань, і в результаті, в метод потрапляє, так би мовити, копія посилання, так що, Ви можете змінювати об'єкт, на який посилається ця копія (т. е. той же об'єкт, на який посилає та оригінал посилання), але не можете змусити оригінальне посилання вказувати на інший об'єкт. А ось при використанні типів значень ситуація інша, і проблеми можуть спливти відразу ж!

Давайте уявімо, що нам потрібно написати метод, який приймає два цілих числа та змінює місцями їх значення, виглядати такий метод може приблизно так:

Здавалося б, нічого простіше немає, але на практиці такий метод працювати не буде! Якщо ми напишемо код подібний до наступного:

То ми побачимо приблизно такий результат роботи програми:

Результат роботи методу Swap

А виклик методу Swap буде таким:

І тоді, результат роботи методу, буде таким:

Результатроботи доопрацьованого методу Swap

Як бачите, подібні проблеми вирішуються передачі параметрів методи вирішуються досить просто, навіть не довелося переписувати «логіку» методу. Але є одна особливість, об'єкт, який передається якref -параметр методу, повинен бути ініціалізований перед викликом методу. Тобто. подібний код, компілюватися не буде:

Але бувають такі ситуації, коли перед передачі об'єкта в метод, який повинен змінити його значення, ми не знаємо чим ініціалізувати даний об'єкт (можна звичайно ініціалізувати його абияк, але це досить коряво), у таких випадках можна передати параметр у метод не як посилання, як чисто вихідний параметр. Робиться це просто, ключове словоref, замінюється на ключове словоout.

Уявімо, що нам потрібно написати метод, який має приймати не ініціалізований цілісний параметр, заповнювати його випадковим значенням. Виглядати це може приблизно так:

Використовувати метод можна так:

Приклад, звичайно надуманий, можна було б не працювати з вихідними параметрами, а просто повертати випадкове значення методом SetValue, але в реальній практиці, можна зіткнутися з ситуацією, що метод вже повертає якесь значення, або потрібно заповнити кілька вихідних параметрів.