代码改变世界

C#Trick&Tip: 使用 ref 与 out 传递参数的区别

2006-11-19 20:24  晓风残月  阅读(...)  评论(...编辑  收藏

很早就知道C# 提供了 ref 和 out 关键字以便参数按引用(地址)传递,用着用着经常搞混淆了,从MSDN中整理了一下,方便以后查阅:

相同点:
1.使参数按引用传递,注意这里的“引用”与我们通常说的“对象引用”不一样,可以形象的理解为,类似于C/C++中传指针(地址)。
2.效果是,被调用方对该参数的修改会反映到该变量中,即当调用结束返回时,调用方看到的是修改过的值。
3.方法定义和调用方法都必须显式使用 ref 或者 out 关键字

不同点:
1。传递到 ref 的参数必须最先初始化,即由调用方显式初始化。
2。传递到 out 的参数在传递之前不需要显式初始化,但需要调用方在方法返回之前必须对其赋值。

使用场景:

关于重载说明:
1。refout 关键字在运行时的处理方式不同,但在编译时的处理方式相同。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。
2。但是,如果一个方法采用 refout 参数,而另一个方法不采用这两类参数,则可以进行重载。

关于使用 ref 和 out 传递数组
// continued in future

MSDN:
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_csref/html/b8a5e59c-907d-4065-b41d-95bf4273c0bd.htm
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_csref/html/7e911a0c-3f98-4536-87be-d539b7536ca8.htm
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_csref/html/6a2b261e-a1cc-49a6-b4f0-6cacae385a1e.htm