.NET中ref和out参数的区别
.NET中ref
和out
参数有什么区别? 什么情况下,一个人可以比另一个更有用? 什么是代码片段,其中一个可以使用,另一个不可以?
它们几乎相同 - 唯一的区别是你作为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
),它们已经在使用返回值。
为什么C#同时拥有'ref'和'out'?
带out参数的方法的调用者在调用之前不需要分配给作为out参数传递的变量; 但是,被调用者在返回之前需要分配给out参数。
相反,参考参数被认为是由调用者初始分配的。 因此,被调用者在使用前不需要分配给ref参数。 参数参数传入和传出方法。
所以, out
意味着出局,而ref
是进出。
这些密切对应于[out]
和[in,out]
的COM接口参数的优点, out
参数是呼叫者需要不通过在其不需要由该方法被调用的情况下预先分配对象-这避免了分配成本以及可能与编组相关的任何成本(更可能与COM相关,但在.NET中并不罕见)。
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
:没有任何信息传递给远程通话。 更快。
从技术上讲,你可以使用总是ref
来代替out
,但是out
允许你更精确地讨论争论的含义,有时它可以更有效。
上一篇: Difference between ref and out parameters in .NET
下一篇: What's the difference between struct and class in .NET?