在C#中,ref
和out
参数有什么区别?
示例:
void method1(ref int p1)
{
//....
}
void method2(out int p2)
{
//....
}
另外,每种方法的使用指南是什么?
答案 0 :(得分:12)
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的别名变量。这是合法的:
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
具有相同的实施方式;唯一的区别是编译器如何跟踪变量是否被分配。
使用指南是:
答案 1 :(得分:4)
直接来自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
。