c#中ref和out的区别我在网上看到说这两个的区别主要有以下三点:1、以 ref 參數傳遞的引數必須先被初始化,ou
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则不必
个人理解
[解决办法]
个人认为哈,这俩个关键字侧重点不一样。
ref 侧重将值传进去,
Out 侧重将值返回回来。
所有 ref 必须先赋值,然后再传递
而Out 传递到方法体里,必须执行一个赋值的操作。
个人理解哈。。
[解决办法]设计好了你压根用不着ref或者out。。。。
[解决办法]你说的没错,没有out程序一样运转,没有ref也可以,甚至没有函数调用这个概念,仍然可以写程序,从数学的角度来说,只要你拿掉语法中的某个特性,这个语言是图灵完备的,那么它可以等价实现任何图灵完备的另一种语言的所有功能。那么为什么我们要这些语法特性——如果你不是程序员,你永远也想不通!
[解决办法]一般参数是传值,ref是传址,out是返回值,所以变量可以最初不初始化。
------解决方案--------------------
楼主何必对此纠结,它们的区别不在参数的传递方式上,而在于使用习惯。
需要用哪个就用哪个,本人基本不用。
[解决办法]博采众长一下,前几日看的ref out 区别,在此又深挖了一锹,引用和指针问题上还有疑惑,继续挖
[解决办法]语义上更清晰吧!
[解决办法]参考这个博客:http://www.cnblogs.com/gjahead/archive/2008/02/28/1084871.html
[解决办法]参考这里:http://msdn.microsoft.com/zh-cn/library/t3c3bfhx(v=VS.80).aspx
[解决办法]我觉得这个没有用纠结多少.只要你知道 out 和 ref是做什么,什么时候要用到就行了:
ref 必须先初始化,因为是引用,所以必须先有才能使用,
而out则是内部为外部赋值,所以不需要初始化,而且初始化了也没有用。
[解决办法]还有的是,out 一般是用于 多个返回值的情况,比如试图解析 string 为 double 的 TryParse方法.
我觉得,你只要理解他们什么时候需要用就可以了...
[解决办法]out和ref编译结果都一样,都是传引用,不过在编译检查初始化上不一样,
[解决办法]void abc(ref int a,ref string b)
{
}
如果调用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,告诉什么叫敲键盘速度
[解决办法]大家分析的都挺好的。我就是来看看。。。。。。。。。。
[解决办法]魔兽争霸可以告诉什么叫鼠标点击