前几天有人问我他们什么时候应该使用参数关键字out而不是ref。虽然我(我认为)理解ref和out关键字之间的区别(之前已经问过了),最好的解释似乎是ref == in和out,有什么(假设或代码)的例子,我应该总是使用out而不是ref。
既然ref更通用,为什么还要用out呢?它只是语法上的糖吗?
前几天有人问我他们什么时候应该使用参数关键字out而不是ref。虽然我(我认为)理解ref和out关键字之间的区别(之前已经问过了),最好的解释似乎是ref == in和out,有什么(假设或代码)的例子,我应该总是使用out而不是ref。
既然ref更通用,为什么还要用out呢?它只是语法上的糖吗?
当前回答
Out是ref的约束版本。
在方法体中,需要在离开方法之前为所有out参数赋值。 另外,分配给out形参的值将被忽略,而ref要求分配这些值。
out允许你这样做:
int a, b, c = foo(out a, out b);
其中ref需要分配a和b。
其他回答
在c#中如何使用in或out或ref ?
All keywords in C# have the same functionality but with some boundaries. in arguments cannot be modified by the called method. ref arguments may be modified. ref must be initialized before being used by caller it can be read and updated in the method. out arguments must be modified by the caller. out arguments must be initialized in the method Variables passed as in arguments must be initialized before being passed in a method call. However, the called method may not assign a value or modify the argument.
以下类型的方法不能使用in、ref和out关键字:
Async方法,通过使用Async修饰符来定义。 迭代器方法,其中包括yield return或yield break语句。
下面是我从这篇关于c# Out Vs Ref的codeproject文章中摘录的一些注释
只有当我们期望从一个函数或方法得到多个输出时,才应该使用它。对结构的思考也是一个不错的选择。 REF和OUT是关键字,它们指示数据如何从调用方传递到被调用方,反之亦然。 在REF中,数据以两种方式传递。从呼叫者到被呼叫者,反之亦然。 In Out数据仅以一种方式从被调用方传递给调用方。在这种情况下,如果Caller试图向被调用方发送数据,它将被忽略/拒绝。
如果你是一个视觉人,那么请看看这个yourtube视频,它演示了实际的区别https://www.youtube.com/watch?v=lYdcY5zulXA
下图更直观地显示了差异
使用out表示该参数未被使用,仅被设置。这有助于调用者理解您总是在初始化参数。
此外,ref和out不仅适用于值类型。它们还允许您重置引用类型从方法中引用的对象。
Out是ref的约束版本。
在方法体中,需要在离开方法之前为所有out参数赋值。 另外,分配给out形参的值将被忽略,而ref要求分配这些值。
out允许你这样做:
int a, b, c = foo(out a, out b);
其中ref需要分配a和b。
还是觉得需要好好总结一下,这就是我想出来的。
总结,
当我们在函数内部时,这就是我们如何指定变量数据访问控制,
in = R
out = W必须在R之前
参考 = R+W
解释,
in
函数只能读取该变量。
out
变量不能先初始化,因为, 函数必须先写后读。
ref
函数可以读/写该变量。
为什么要这样命名呢?
关注数据被修改的地方,
in
数据必须在输入(in)函数之前设置。
out
数据必须只在离开(out)函数之前设置。
ref
在输入函数之前必须设置数据。 在离开(out)函数之前可以设置数据。