Підрозділ 2.19
Передача параметрів за посиланням та значенням. Вихідні параметри
Розбирає передачу параметрів за значенням і за посиланням, модифікатори ref, out, in та їх вплив на змінні.
2.19. Передача параметрів за посиланням та значенням. Вихідні параметри
Коли метод отримує параметр, виникає ключове питання: що саме він отримує — незалежну копію значення чи прямий доступ до оригінальної змінної в пам'яті? Відповідь на це питання визначає поведінку всієї програми. У C# існують два принципово різні способи передачі параметрів: за значенням і за посиланням. Вибір між ними впливає на те, чи зможе метод змінити вхідні дані, скільки значень він здатний повернути, і наскільки ефективно використовується пам'ять.
Передача параметрів за значенням
Передача за значенням — це стандартний і найпростіший спосіб. Коли аргумент передається за значенням, метод отримує окрему копію змінної. Метод працює зі своєю копією незалежно від оригінальної змінної, і будь-які зміни всередині методу не впливають на змінну у викликаючому коді.
Метод RegisterPulse отримує копію значення patientPulse. Збільшення pulse всередині методу змінює лише цю копію — вона існує окремо в пам'яті і зникає після завершення методу. Оригінальна змінна patientPulse у викликаючому коді залишається незмінною.

Передача параметрів за посиланням та модифікатор ref
При передачі за посиланням метод отримує не копію, а адресу оригінальної змінної в пам'яті. Це означає, що параметр і оригінальна змінна вказують на одне й те саме місце в пам'яті. Будь-яка зміна параметра всередині методу відразу відображається на оригінальній змінній.
Для передачі за посиланням використовується модифікатор ref — він вказується як при оголошенні методу, так і при кожному виклику:
Обидві змінні sys і dia передаються за посиланням. Метод NormalizeBloodPressure безпосередньо змінює їх значення у пам'яті — після виклику в змінних буде вже скоригований тиск. Зверніть увагу: ключове слово ref потрібне і в оголошенні методу, і в кожному виклику — це явний сигнал читачу, що значення можуть змінитись.
Змінна, яка передається через ref, обов'язково повинна бути ініціалізована перед викликом. Компілятор не дозволить передати неініціалізовану змінну — адже метод може як читати, так і записувати значення.
Вихідні параметри. Модифікатор out
Модифікатор out схожий на ref, але з важливою відмінністю: вихідний параметр не потребує ініціалізації до виклику — він призначений виключно для повернення значення з методу. Натомість метод зобов'язаний присвоїти йому значення перед завершенням.
Головна перевага out-параметрів — можливість повернути кілька значень з одного методу. Оператор return дозволяє повернути лише одне значення, тоді як метод може мати довільну кількість out-параметрів.
Якщо метод не присвоює значення out-параметру — це помилка компіляції. Компілятор суворо відстежує, що кожна гілка виконання методу обов'язково записує значення в усі out-параметри:
// ПОМИЛКА — out-параметр не отримав значення
void GetData(out int result)
{
Console.WriteLine("обробка...");
// result не присвоєно — компілятор відмовить
}Inline-оголошення out-змінних
C# дозволяє оголошувати змінні, що передаються як out-аргументи, безпосередньо у місці виклику методу — без попереднього оголошення:
Якщо тип out-змінної можна визначити автоматично, замість явного типу можна писати var:
AnalyzeBloodTest(85.0, out var hasAnemia, out var grade);Компілятор сам визначає тип змінних зі сигнатури методу. Це зручно, коли тип довгий або очевидний з контексту.
Вхідні параметри. Модифікатор in
Модифікатор in вирішує специфічну задачу: передати параметр за посиланням (уникнувши копіювання), але заборонити його зміну всередині методу. Це комбінація ефективності посилання і гарантії незмінності значення.
Модифікатор in на стороні виклику є необов'язковим — компілятор розуміє що передається за посиланням і без нього. Але явне написання in корисне для читача: воно підкреслює, що змінна передається за посиланням і не буде змінена.
Практична цінність in найбільша для великих структур (struct з багатьма полями), де копіювання дорого коштує. Для примітивних типів (int, double) різниця непомітна.
Порівняння модифікаторів

Коротке практичне правило вибору:
ref— коли метод повинен і читати, і змінювати існуюче значення (наприклад, лічильник, накопичувач);out— коли метод повинен повернути кілька результатів, яких ще не існує;in— коли метод лише читає велику структуру і не повинен її змінювати;- без модифікатора — у більшості випадків, коли метод просто використовує отримані дані.