out
out关键字会导致参数通过引用来传递。这与ref 关键字类似, 不同之处在于ref 要求变
量必须在传递之前进行初始化。若要使用out参数,方法定义和调用方法都必须显式使用
out关键字。例如:
classOutExample
{
staticvoidMethod(outinti)
{
i = 44;
}
staticvoidMain()
{
intvalue;
Method(out value);
// value is now 44
}
}
尽管作为 out 参数传递的变量不必在传递之前进行初始化,但被调用的方法需要在返回之前赋一个值。
尽管 ref 和 out
关键字会导致不同的运行时行为,
但在编译时并不会将它们视为方法签名
的一部分。
因此,如果两个方法唯一的区别是:一个接受
ref 参数,另一个接受
out 参
数,则无法重载这两个方法。
例如,不会编译下面的代码:
个人收集整理 勿做商业用途
class CS0663_Example
{
// Compiler error CS0663: "Cannot define overloaded
个人收集整理
勿做商业用
途
// methods that differ only on ref and out".
public
void
SampleMethod(
out
int
i) { }
public
void
SampleMethod(
ref
int
i) { }
}
但是,如果一个方法采用ref
或 out 参数,而另一个方法不采用这两类参数,则可以进行
重载,如下所示:
个人收集整理
勿做商业用途
classOutOverloadExample
{
publicvoidSampleMethod(inti) { }
1 / 8
publicvoidSampleMethod(outinti) { i = 5; }
}
属性不是变量,因此不能作为out参数传递。
有关传递数组的信息,请参见使用ref 和 out传递数组( C# 编程指南) 。 个人收集整理 勿
做商业用途
示例
当希望方法返回多个值时,声明out方法很有用。下面的示例使用out在一次方法调用
中返回三个变量。请注意,第三个参数所赋的值为Null 。 这样使方法可以有选择地返回
值。个人收集整理勿做商业用途
classOutReturnExample
{
staticvoidMethod(outinti,outstrings1,outstrings2) 个人收集
整理 勿做商业用途
{
i = 44;
s1 ="I've been returned";
s2 =null;
}
staticvoidMain()
{
intvalue;
stringstr1, str2;
Method(out value,out str1,out str2);
value is now 44
str1 is now "I've been returned"
str2 is (still) null;
}
}
C# 语言规范
有关更多信息,请参见C# Language Specification。 C# 语言规范是C# 语法和用法的权
威资料。 个人收集整理 勿做商业用途
2 / 8
个人收集整理 勿做商业用途
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
个人收集整理勿做商业用途
ref ( C# 参考)
Visual Studio 2010
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改
都将反映在该变量中。个人收集整理勿做商业用途
说明
不要将 “通过引用传递 ”概念与 “引用类型 ”概念相混淆。 这两个概念不相关; 方法参数无论是值类型还是引用类型,都可通过 ref 进行修饰。 因此,通过引用传递值类型时没有值类型装箱。
若要使用ref 参数,则方法定义和调用方法都必须显式使用ref 关键字。例如:
classRefExample
{
staticvoidMethod( refinti)
{
i = 44;
}
staticvoidMain()
{
intval = 0;
Method(refval);
// val is now 44
}
}
传递到 ref 参数的参数必须最先初始化。 这与 out 不同,后者的参数在传