我在网上看到说这两个的区别主要有以下三点:
1、以 ref 參數傳遞的引數必須先被初始化,out 則不需要。
2、out 參數要在離開目前的方法之前至少有一次指派值的動作。
3、若兩個方法僅有 ref、out 關鍵字的差異,在編譯期會視為相同方法簽章,無法定義為多載方法。我就再想,需要用out实现的功能ref都可以实现啊,都是为了让调用函数不进行值拷贝而直接改变实参的值么?有什么不对?谁能举一个只能用out而不能用ref替换的例子?
(刚开始学C#,疑惑中……)C#outref区别
1、以 ref 參數傳遞的引數必須先被初始化,out 則不需要。
2、out 參數要在離開目前的方法之前至少有一次指派值的動作。
3、若兩個方法僅有 ref、out 關鍵字的差異,在編譯期會視為相同方法簽章,無法定義為多載方法。我就再想,需要用out实现的功能ref都可以实现啊,都是为了让调用函数不进行值拷贝而直接改变实参的值么?有什么不对?谁能举一个只能用out而不能用ref替换的例子?
(刚开始学C#,疑惑中……)C#outref区别
{
}如果调用abc(),需要先int aa=0;
string bb="";
abc(aa,bb);如果是void abc(out int a,out string b)
{
}
那么
int aa;
string bb;
abc(aa,bb);
刚在《C#本质论》中看到这段话觉得很有用,说明了原因:———————————————————————————————————————————————————————————————————————————————————
“在 C 风格的语言中,函数常常能从一个例程中输出多个值,这是使用输出参数实现的,只要把输出值赋给通过引用传递给方法的变量即可。通常,变量通过引用传送的初值是不重要的,这些值会被函数重写,函数甚至从来没有使用过它们。
如果可以在C#中使用这种约定,就会非常方便。但C#要求变量在被引用前必须用一个初值进行初始化。尽管在把输入变量传递给函数前,可以用没有意义的值初始化它们,因为函数将使用真实、有意义的值初始化它们,但是这样做是没有必要的,有时甚至会引起混乱。但有一种方法能够简化C#编译器所坚持的输入参数的初始化。
编译器使用out 关键字来初始化。当在方法的输入参数前面加上out 关键字时,传递给该方法的变量可以不初始化。该变量通过引用传送,所以在从被调用的方法中返回时,方法对该变量进行的任何改变都会保留下来。在调用该方法时,还需要使用out 关键字,与在定义该方法时一样。”
这也是为什么用ref时必须对其初始化,而out则不必
个人理解
个人认为哈,这俩个关键字侧重点不一样。
ref 侧重将值传进去,
Out 侧重将值返回回来。所有 ref 必须先赋值,然后再传递
而Out 传递到方法体里,必须执行一个赋值的操作。个人理解哈。。
ref 必须先初始化,因为是引用,所以必须先有才能使用,
而out则是内部为外部赋值,所以不需要初始化,而且初始化了也没有用。
我觉得,你只要理解他们什么时候需要用就可以了...
{
}如果调用abc(),需要先int aa=0;
string bb="";
abc(aa,bb);如果是用上面的,abc执行后(如果aa\bb的值仍与初始化的值相同),你知道aa\bb的值是否被改变了么?甚至于,方法中可能根本就未对aa\bb进行操作.由此可能会产生一些混淆情况.譬如,你用aa\bb获取一个温度值和压力值,你初始化并执行方法,如果值都没有发生变化,你能完全确定温度和压力没有正确获取么? 也许当前温度和压力都恰好是你初始化的值呢? 当参数较多时,用返回值来标识方法的执行情况就显得心有余力不足了.因为你要用一堆Case来判定如果是void abc(out int a,out string b)
{
}
那么
int aa;
string bb;
abc(aa,bb);用它,则可以肯定aa\bb在方法内是被处理过的.
我举2个例子.第一种,调用前不知道如何初始化才好。就拿object类型来说,我只想得到函数返回的结果用于参照,得到类型可能是数也可能字符串也可能是对象类。又或者不知道对象是否初始化,从数据库中抽取的数组中,哪个为被初始化,并不确定。这时用out。
第二种,函数内部,我要参照,我要使用对象的方法,比方说参数为整数,要判断它长度,我是不是要ToString,但是参数为被初始化的情况下,空对象没有ToString方法会造成异常。这时我用ref.根据具体情况来,两者可以相互替代,就拿第二种来说,你调用ToString前判断下是否为空未被初始化。也能使用out。
代码越精炼越好,可惜很多公司看着一天多少行代码。“码农"不就这么来的?!
对不起,我是IT技术男,不是码字男。
码字??来拳皇PK,告诉什么叫敲键盘速度
不能吧,会报错的吧
不能吧,会报错的吧不报错.我调试代码经常这么干的啊