Функция с параметром с ключевым словом 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-параметров используется один и тот же механизм, но это незначительная техническая подробность. Разница в семантике.
Комментариев нет:
Отправить комментарий