Чому у C # є і вихід, і ref?


18

C # має outта refключові слова. Чому ці два потрібні? Відмова: Я не маю глибоких знань C #.


3
Чи немає дублікату між веб-сайтів у переповнення стека?
Пітер Мортенсен


2
Ви просите різницю між refі out? Або ви запитуєте, яке використання аргументів посилання ref/ outпорівняння з аргументами за значенням (немає модифікатора параметра)? Або обоє?
Jeppe Stig Nielsen

1
Я вважаю, що це питання схоже, але не зовсім повторюване - принаймні, якщо воно взято з точки зору дизайну мови
jmoreno

Відповіді:


32

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


10
Ref vs out набагато важливіше для компілятора, ніж програмісту. Компілятор зобов'язаний переконатися, що ви не читаєте змінну до того, як їй буде призначено значення, і outнадає їй спосіб зробити так, що краще відповідає тому, як ви хочете мати справу зі змінними в першу чергу.
Корт Аммон - Поновіть Моніку

Чи можете ви детальніше роз’яснити: «out» повідомляє щось, що «ref» не відповідає.
Нео

4
@Neo: В основному те, що я сказав у відповіді: Він повідомляє, що вам не байдуже використовувати це для введення даних, і тому безпечно передати неініціалізоване значення outпараметрі, оскільки функція, що отримує його, не збирається читати з нього .
Мейсон Уілер

@MasonWheeler Чи дозволено це (і / або застосовано на кінці прийому) верифікатором? Вихід - це лише атрибут, внутрішньо.
Випадково832

@ Random832: Як Роберт розмістив під своєю відповіддю, подивіться на Еріка Ліпперта (колишнього хлопця компілятора C #), який обговорює це на сайті stackoverflow.com/q/2876315
Мейсон Уілер

7

Щоб зрозуміти ці два ключові слова, вам потрібно зрозуміти, що передавати значення за допомогою довідкових засобів. По суті це означає, що якщо ви змінюєте змінну параметра, яку ви передаєте в межах методу або функції, ця змінна зберігає своє змінене значення, коли функція завершується. Оголошення параметра таким чином refабо його outвиконання, тоді як звичайна змінна параметр зберігає своє початкове значення, навіть якщо ви змінили його у функції.

Єдина відмінність між refі outполягає в тому, outщо не потрібно, щоб ви ініціалізували змінну, перш ніж передати її у функцію, але refце роблять; в той час як out дійсно вимагають , щоб призначити що - то до змінної всередині функції, але refне робить.


Чи не існує різниці, пов'язаної з дисперсією?
monocell

Дивіться відповідь Еріка Ліпперта на stackoverflow.com/q/2876315
Роберт Харві

2

Ти запитав.

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

І відповідь полягає в тому, що вони НЕ ЗАБЕЗПЕЧЕНО, наприклад, java не має жодного, а VB має лише ref (і вимагає цього лише в декларації методу).

Ви можете легко написати всю програму, не використовуючи жодної.

Вони існують, тому що іноді є корисними. Ось чому їх є дві, а не одна - тому, що корисно зробити відмінність між "ось щось, змінити його, якщо хочете" і "надати цій речі нове значення".

Інші мови мають різні пріоритети, і тому вони можуть включати ці аналогічні або не можуть. Вони навіть можуть не погоджуватися з того, чи корисне те чи інше, і тому можуть активно вирішити НЕ впроваджувати те чи інше.


1

В основі їх обох refі outзабезпечують механізм передачі адреси змінної методу, щоб вона могла бути оновлена ​​- присвоєння параметру refабо outоновлення змінної в контексті виклику. Там, де вони відрізняються, є гарантії: outгарантії на те, що змінна буде оновлена, refні.

З іншого боку дзвінка є подібні відмінності. outПараметр нашого методу не гарантується містить нічого корисного після прибуття і повинен бути встановлений на значення в який - то момент, в той час як refпараметр можна припустити , що він має значення , і ми не повинні робити нічого конкретного з ним.

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

З точки зору використання: як правило, я використовую outситуацію, коли мені не байдуже вміст змінної, коли вона надходить як параметр і refколи я це роблю.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.