.NET中ref和out参数的区别是什么?在什么情况下,一个会比另一个更有用?一个可以使用而另一个不能使用的代码片段是什么?


当前回答

ref关键字用于通过引用传递值。(这并不排除传递的值是值类型或引用类型)。用out关键字指定的输出参数用于从方法返回值。

代码中的一个关键区别是必须在方法中设置输出参数的值。对于ref参数则不是这样。

欲了解更多细节,请访问http://www.blackwasp.co.uk/CSharpMethodParameters.aspx

其他回答

Out参数由调用的方法初始化,ref参数在调用方法之前初始化。因此,当您只需要获得第二个返回值时,使用out参数,ref参数用于获取一个值并可能返回对该值的更改(次于主返回值)。

它们几乎是一样的-唯一的区别是,作为out形参传递的变量不需要初始化,但作为ref形参传递的变量必须设置为某个值。

int x;
Foo(out x); // OK

int y;
Foo(ref y); // Error: y should be initialized before calling the method

Ref形参用于可能被修改的数据,out形参用于已经使用返回值的函数(例如int.TryParse)的额外输出数据。

Ref和out都允许被调用的方法修改参数。它们之间的区别在于你做决定之前发生了什么。

Ref意味着参数在进入函数之前已经有了一个值。被调用的函数可以在任何时候读取或更改值。参数输入,然后输出 Out表示参数在进入函数之前没有正式值。被调用的函数必须初始化它。参数只输出

这是我最喜欢的看待它的方式:ref是通过引用传递变量。Out是声明函数的第二个返回值。就像你可以这样写:

// This is not C#
public (bool, string) GetWebThing(string name, ref Buffer paramBuffer);

// This is C#
public bool GetWebThing(string name, ref Buffer paramBuffer, out string actualUrl);

以下是每种替代方法的更详细的效果列表:

在调用方法之前:

ref:调用方必须在将参数传递给被调用方法之前设置它的值。

out:调用方方法在调用方法之前不需要设置参数的值。很可能,你不应该这么做。事实上,任何当前值都将被丢弃。

通话过程中:

ref:被调用的方法可以在任何时候读取参数。

out:被调用的方法必须在读取参数之前初始化它。

远程调用:

ref:当前值被编组到远程调用。额外的性能成本。

out:没有任何东西传递给远程调用。得更快。

从技术上讲,您可以使用always ref来代替out,但out允许您更精确地确定参数的含义,有时它可以更有效。

在函数中不需要设置Ref形参,而out形参必须在退出函数之前绑定到一个值。传递出去的变量也可以在没有初始化的情况下传递给函数。

它们有微妙的不同。

out形参在传递给方法之前不需要由被调用方初始化。因此,任何带有out参数的方法

在为参数赋值之前无法读取该参数 必须在返回之前给它赋值吗

这用于需要覆盖其参数的方法,而不管其先前的值如何。


ref形参在传递给方法之前必须由被调用方初始化。因此,任何带有ref参数的方法

在赋值之前可以检查值吗 可以返回原值,不受影响吗

这用于必须检查其值并对其进行验证或规范化的方法。