方法参数中ref,val和out的含义是什么?

我在寻找一个清晰,简洁和准确的答案。

理想情况下,作为实际答案,尽管欢迎提供良好解释的链接。

这也适用于VB.Net,但关键字不同 - ByRefByVal


默认情况下(在C#中),将对象传递给函数实际上将引用的副本传递给该对象。 更改参数本身只会更改参数中的值,而不会更改指定的变量。

void Test1(string param)
{
    param = "new value";
}

string s1 = "initial value";
Test1(s1);
// s1 == "initial value"

使用outref将对调用中指定的变量的ref传递给该函数。 任何对outref参数值的更改都会传回给调用者。

除了一个细微的差别外, outref都具有相同的行为: 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指出的那样, outref之间的差别只能由C#编译器执行,而不能由CLR执行。 据我所知,VB没有等同于out并且仅实现ref (如ByRef ),匹配CLR的支持。


关于ref和out的另一个注释:两者之间的区别由C#编译器强制执行。 CLR不区分out和ref。 这意味着你不能有两个方法,它们的签名只有out或ref才有区别

void foo(int value) {}

// Only one of the following would be allowed

// valid to overload with ref
void foo(ref int value) {}

// OR with out
void foo(out int value) {}

out意味着该参数将通过以下方法进行初始化:

int result; //not initialised

if( int.TryParse( "123", out result ) )
   //result is now 123
else
   //if TryParse failed result has still be 
   // initialised to its default value (0)

ref会强制传递底层引用:

void ChangeMyClass1( MyClass input ) {
   input.MyProperty = "changed by 1";
   input = null;
   //can't see input anymore ... 
   // I've only nulled my local scope's reference
}

void ChangeMyClass2( ref MyClass input ) {
   input.MyProperty = "changed by 2";
   input = null;
   //the passed reference is now null too.
}

MyClass tester = new MyClass { MyProperty = "initial value" };

ChangeMyClass1( tester );
// now tester.MyProperty is "changed by 1"

ChangeMyClass2( ref tester );
// now tester is null
链接地址: http://www.djcxy.com/p/20657.html

上一篇: What do ref, val and out mean on method parameters?

下一篇: Why doesn't this work if in Ruby everything is an Object?