В основі їх обох refі outзабезпечують механізм передачі адреси змінної методу, щоб вона могла бути оновлена - присвоєння параметру refабо outоновлення змінної в контексті виклику. Там, де вони відрізняються, є гарантії: outгарантії на те, що змінна буде оновлена, refні.
З іншого боку дзвінка є подібні відмінності. outПараметр нашого методу не гарантується містить нічого корисного після прибуття і повинен бути встановлений на значення в який - то момент, в той час як refпараметр можна припустити , що він має значення , і ми не повинні робити нічого конкретного з ним.
Ця різниця впливає на аналіз коду, генерування та оптимізацію коду, який, хоча і не дуже очевидний для нас більшість часу, може мати певний вплив на спосіб роботи наших програм. Генератор коду може відкласти розподіл змінної безпосередньо перед викликом, оптимізатор може вирішити, що вона може змінити послідовність деяких операцій на основі контракту тощо.
З точки зору використання: як правило, я використовую outситуацію, коли мені не байдуже вміст змінної, коли вона надходить як параметр і refколи я це роблю.