现在的位置: 首页 > 综合 > 正文

c#中ref和out的区别

2013年12月07日 ⁄ 综合 ⁄ 共 1046字 ⁄ 字号 评论关闭

通过值传送变量是默认的,也可以迫使值参数通过引用传送给方法。为此,要使用ref
关键字。如果把一个参数传递给方法,且这个方法的输入参数前带有ref 关键字,则该方
法对变量所作的任何改变都会影响原来对象的值:
static void SomeFunction(int[] ints, ref int i)
{
ints[0] = 100;
i = 100; //the change to i will persist after SomeFunction() exits
}
在调用该方法时,还需要添加ref 关键字:
SomeFunction(ints, ref i);
在C#中添加ref 关键字等同于在C++中使用&语法指定按引用传递参数。但是,C#在
调用方法时要求使用ref 关键字,使操作更明确(因此有助于防止错误)。
最后,C#仍要求对传递给方法的参数进行初始化,理解这一点也是非常重要的。在传
递给方法之前,无论是按值传递,还是按引用传递,变量都必须初始化。
(5) out 关键字
在 C 风格的语言中,函数常常能从一个例程中输出多个值,这是使用输出参数实现的,
只要把输出值赋给通过引用传递给方法的变量即可。通常,变量通过引用传送的初值是不
重要的,这些值会被函数重写,函数甚至从来没有使用过它们。
如果可以在C#中使用这种约定,就会非常方便。但C#要求变量在被引用前必须用一
个初值进行初始化。尽管在把输入变量传递给函数前,可以用没有意义的值初始化它们,
因为函数将使用真实、有意义的值初始化它们,但是这样做是没有必要的,有时甚至会引
起混乱。但有一种方法能够简化C#编译器所坚持的输入参数的初始化。
编译器使用out 关键字来初始化。当在方法的输入参数前面加上out 关键字时,传递
给该方法的变量可以不初始化。该变量通过引用传送,所以在从被调用的方法中返回时,
方法对该变量进行的任何改变都会保留下来。在调用该方法时,还需要使用out 关键字,
与在定义该方法时一样:
static void SomeFunction(out int i)
{
i = 100;
}
public static int Main()
{
int i; // note how i is declared but not initialized
SomeFunction(out i);
Console.WriteLine(i);
第3 章对象和类型
83
return 0;
}
out 关键字是C#中的新增内容,在Visual Basic 和C++中没有对应的关键字,该关键
字的引入使C#更安全,更不容易出错。如果在函数体中没有给out 参数分配一个值,该方
法就不能编译。

抱歉!评论已关闭.