ref
在 C# 中,和out
参数有什么区别?
例子:
void method1(ref int p1)
{
//....
}
void method2(out int p2)
{
//....
}
另外,每个的使用指南是什么?
ref
在 C# 中,和out
参数有什么区别?
例子:
void method1(ref int p1)
{
//....
}
void method2(out int p2)
{
//....
}
另外,每个的使用指南是什么?
ref 参数和 out 参数都为变量创建别名。也就是说,当你说:
M(int x) { ... }
...
int y = 123;
M(y);
然后传递 y 的值,并且 x 获取该值的副本。
当你说
N(ref int x) { ... }
...
int y = 123;
N(ref y);
那么x 和 y 是同一个变量的两个名称。对 x 的更改会导致对 y 的更改。
从调用者的角度来看, ref 和 out 之间的唯一区别是,由 ref 别名的变量必须在 call 之前明确分配。这是合法的:
O(out int x) { ... }
...
int y; // no initialization!
O(out y);
但这不是:
N(ref int x) { ... }
...
int y; // no initialization!
N(ref y);
从被调用者的角度来看,唯一的区别是:
ref
可以假设最初分配了一个参数;out
参数不能。out
必须在控制正常离开方法之前分配参数。也就是说,这是非法的:
void O(out int x) { return; }
x
必须在返回之前分配。
在幕后,ref
和out
有同样的实现;唯一的区别是编译器如何跟踪变量是否被赋值。
它们的使用指南是:
直接来自 MSDN 文档:
out 关键字导致参数通过引用传递。这类似于 ref 关键字,不同之处在于 ref 要求在传递变量之前对其进行初始化。
来源: http: //msdn.microsoft.com/en-US/library/t3c3bfhx (v=vs.80).aspx
我觉得这已经够清楚了。如果这不能回答您的问题,请告诉我。
另一个懒惰的例子的复制粘贴:
class OutExample
{
static void Method(out int i)
{
i = 44;
}
static void Main()
{
int value;
Method(out value);
// value is now 44
}
}
因此,在这种情况下,如果是这样,则Method(ref int i)
该方法将要求i
首先对其进行初始化。