日期:2014-05-17  浏览次数:20784 次

c#中ref和out的区别
我在网上看到说这两个的区别主要有以下三点:
1、以 ref 參數傳遞的引數必須先被初始化,out 則不需要。
2、out 參數要在離開目前的方法之前至少有一次指派值的動作。
3、若兩個方法僅有 ref、out 關鍵字的差異,在編譯期會視為相同方法簽章,無法定義為多載方法。

我就再想,需要用out实现的功能ref都可以实现啊,都是为了让调用函数不进行值拷贝而直接改变实参的值么?有什么不对?谁能举一个只能用out而不能用ref替换的例子?
(刚开始学C#,疑惑中……)
C# out ref 区别

------解决方案--------------------
举个例子来说

void abc(ref int a,ref string b)
{
}

如果调用abc(),需要先

int aa=0;
string bb="";
abc(aa,bb);

如果是void abc(out int a,out string b)
{
}
那么
int aa;
string bb;
abc(aa,bb);


------解决方案--------------------
参考
------解决方案--------------------
是所有的out 都可以 ref 实现
------解决方案--------------------
C++中指针可以是空指针,但是任何时候都不会存在空引用。试想,一个对象它都不存在,更何谈对它的引用?但是指针理论上却可以指向任何地方
这也是为什么用ref时必须对其初始化,而out则不必
个人理解
------解决方案--------------------
引用:
我在网上看到说这两个的区别主要有以下三点:
1、以 ref 參數傳遞的引數必須先被初始化,out 則不需要。
2、out 參數要在離開目前的方法之前至少有一次指派值的動作。
3、若兩個方法僅有 ref、out 關鍵字的差異,在編譯期會視為相同方法簽章,無法定義為多載方法。

我就再想,需要用out实现的功能ref都可以实现啊,都是为了让调用函数不进行值拷贝而直接改变实参的值么?有什么不对?谁能举一个只能用out而不能用ref替换的例子?
(刚开始学C#,疑惑中……)


个人认为哈,这俩个关键字侧重点不一样。
ref 侧重将值传进去,
Out 侧重将值返回回来。

所有 ref 必须先赋值,然后再传递
而Out 传递到方法体里,必须执行一个赋值的操作。

个人理解哈。。
------解决方案--------------------
设计好了你压根用不着ref或者out。。。。
------解决方案--------------------
你说的没错,没有out程序一样运转,没有ref也可以,甚至没有函数调用这个概念,仍然可以写程序,从数学的角度来说,只要你拿掉语法中的某个特性,这个语言是图灵完备的,那么它可以等价实现任何图灵完备的另一种语言的所有功能。那么为什么我们要这些语法特性——如果你不是程序员,你永远也想不通!
------解决方案--------------------
一般参数是传值,ref是传址,out是返回值,所以变量可以最初不初始化。
------解决方案--------------------