Страницы

Поиск по вопросам

понедельник, 1 октября 2018 г.

Чем out отличается от ref?

Функция с параметром с ключевым словом out даёт такой же результат, как и с ref
Такой код:
private void func(out string value) { value = "Hello World!"; }
Даёт такой же эффект, как и
private void func(ref string value) { value = "Hello World!"; }
В чём же разница между out и ref?


Ответ

Разница в том, что out — это выходной параметр, а ref — входно-выходной.
Для ref-параметра вы должны передать его инициализированным, и можете пользоваться его исходным значением. А для out-параметра вы не обязаны инициализировать его перед вызовом функции, не можете использовать его значение в функции до присваивания, и обязаны инициализировать его в функции.
Иллюстрация:
private void func1(out string value) { Console.WriteLine(value); // нельзя, value не инициализировано if (false) return; // нельзя, забыли установить значение value value = "Hello World!"; }
string s1; func1(out s1);

private void func2(ref string value) { Console.WriteLine(value); // можно if (false) return; // не проблема, у value остаётся старое значение value = "Hello World!"; }
string s2; func2(ref s2); // нельзя, функция имеет право использовать значение, // значит, оно должно быть инициализировано сначала
Таким образом, out-параметр — это как бы дополнительное возвращаемое значение функции. А ref-параметр — просто параметр, изменения которого видны снаружи функции.

На уровне CLR для out- и ref-параметров используется один и тот же механизм, но это незначительная техническая подробность. Разница в семантике.

Комментариев нет:

Отправить комментарий