По умолчанию (в C #) передача объекта в функцию фактически передает копию ссылки на этот объект. При изменении самого параметра изменяется только значение в параметре, а не указанная переменная.
void Test1(string param)
{
param = "new value";
}
string s1 = "initial value";
Test1(s1);
// s1 == "initial value"
Использование out
или ref
передает ссылку на переменную, указанную в вызове функции. Любые изменения в значении параметра out
или ref
будут переданы вызывающей стороне.
И out
, и ref
ведут себя одинаково, за исключением одного небольшого различия: параметры ref
необходимо инициализировать перед вызовом, а параметры out
можно неинициализировать. При этом параметры ref
гарантированно инициализируются в начале метода, а параметры out
обрабатываются как неинициализированные.
void Test2(ref string param)
{
param = "new value";
}
void Test3(out string param)
{
// Use of param here will not compile
param = "another value";
}
string s2 = "initial value";
string s3;
Test2(ref s2);
// s2 == "new value"
// Test2(ref s3); // Passing ref s3 will not compile
Test3(out s2);
// s2 == "another value"
Test3(out s3);
// s3 == "another value"
Редактировать : Как указывает dp , разница между out
и ref
обеспечивается только компилятором C #, а не CLR. Насколько я знаю, VB не имеет эквивалента для out
и реализует только ref
(как ByRef
), что соответствует поддержке CLR.