out 和 ref 关键字非常的相似都是以引用的方式来传递。不同的地方在与ref要求传递的变量必须进行初始化。看看下面例子中的表现:
1
class OutRefTest
2
{
3
public void Main()
4
{
5
int parm;
6
TestOut(out parm);
7
//parm的值变成了10.
8
Console.WriteLine("{0}", parm);
9
10
//parm2必须进行初始化
11
int parm2 = 2;
12
TestRef(ref parm2);
13
//parm的值变成了10.
14
Console.WriteLine("{0}", parm);
15
Console.Read();
16
}
17
public void TestOut(out int parm)
18
{
19
parm = 10 //必须赋值.
20
}
21
public void TestRef(ref int parm)
22
{
23
parm = parm * 10; //必须赋值.
24
}
25
}
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](/Images/OutliningIndicators/InBlock.gif)
4
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/InBlock.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
25
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
注意:
1.在使用out来传递变量的时候可以不必为变量parm初始化,而使用ref来传递变量的时候必须为变量parm2进行初始化工作。
2.如果在方法的参数列表中包含了out 或 ref关键字的话,就必须为相应的参数赋值。如方法TestOut 和 TestRef中表现的一样。
使用的时机:
如果你想让你写的方法可以一次返回多个值就需要使用out 或 ref来实现。