我在网上看到说这两个的区别主要有以下三点:
1、以 ref 參數傳遞的引數必須先被初始化,out 則不需要。
2、out 參數要在離開目前的方法之前至少有一次指派值的動作。
3、若兩個方法僅有 ref、out 關鍵字的差異,在編譯期會視為相同方法簽章,無法定義為多載方法。我就再想,需要用out实现的功能ref都可以实现啊,都是为了让调用函数不进行值拷贝而直接改变实参的值么?有什么不对?谁能举一个只能用out而不能用ref替换的例子?
(刚开始学C#,疑惑中……)C#outref区别

解决方案 »

  1.   

    举个例子来说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);
      

  2.   

    嗯,正如你想表达的意思。out就是比ref更清晰更方便了些。
    刚在《C#本质论》中看到这段话觉得很有用,说明了原因:———————————————————————————————————————————————————————————————————————————————————
    “在 C 风格的语言中,函数常常能从一个例程中输出多个值,这是使用输出参数实现的,只要把输出值赋给通过引用传递给方法的变量即可。通常,变量通过引用传送的初值是不重要的,这些值会被函数重写,函数甚至从来没有使用过它们。
    如果可以在C#中使用这种约定,就会非常方便。但C#要求变量在被引用前必须用一个初值进行初始化。尽管在把输入变量传递给函数前,可以用没有意义的值初始化它们,因为函数将使用真实、有意义的值初始化它们,但是这样做是没有必要的,有时甚至会引起混乱。但有一种方法能够简化C#编译器所坚持的输入参数的初始化。
    编译器使用out 关键字来初始化。当在方法的输入参数前面加上out 关键字时,传递给该方法的变量可以不初始化。该变量通过引用传送,所以在从被调用的方法中返回时,方法对该变量进行的任何改变都会保留下来。在调用该方法时,还需要使用out 关键字,与在定义该方法时一样。”
      

  3.   

    是所有的out 都可以 ref 实现
      

  4.   

    C++中指针可以是空指针,但是任何时候都不会存在空引用。试想,一个对象它都不存在,更何谈对它的引用?但是指针理论上却可以指向任何地方
    这也是为什么用ref时必须对其初始化,而out则不必
    个人理解
      

  5.   

    你说的也对,但是当初如果ref被允许可以空引用的话,就不会有out这个东西了,哈哈。但是,正如你所说的,一个对象都不存在,谈何它的引用?有点不合情理,这也可以看做是out产生的一个条件。
      

  6.   


    个人认为哈,这俩个关键字侧重点不一样。
    ref 侧重将值传进去,
    Out 侧重将值返回回来。所有 ref 必须先赋值,然后再传递
    而Out 传递到方法体里,必须执行一个赋值的操作。个人理解哈。。
      

  7.   

    设计好了你压根用不着ref或者out。
      

  8.   

    你说的没错,没有out程序一样运转,没有ref也可以,甚至没有函数调用这个概念,仍然可以写程序,从数学的角度来说,只要你拿掉语法中的某个特性,这个语言是图灵完备的,那么它可以等价实现任何图灵完备的另一种语言的所有功能。那么为什么我们要这些语法特性——如果你不是程序员,你永远也想不通!
      

  9.   

    一般参数是传值,ref是传址,out是返回值,所以变量可以最初不初始化。
      

  10.   

    博采众长一下,前几日看的ref out 区别,在此又深挖了一锹,引用和指针问题上还有疑惑,继续挖
      

  11.   

    参考这个博客:http://www.cnblogs.com/gjahead/archive/2008/02/28/1084871.html
      

  12.   

    参考这里:http://msdn.microsoft.com/zh-cn/library/t3c3bfhx(v=VS.80).aspx
      

  13.   

    我觉得这个没有用纠结多少.只要你知道 out 和 ref是做什么,什么时候要用到就行了:
    ref 必须先初始化,因为是引用,所以必须先有才能使用,
    而out则是内部为外部赋值,所以不需要初始化,而且初始化了也没有用。
      

  14.   

    还有的是,out 一般是用于 多个返回值的情况,比如试图解析 string 为 double 的 TryParse方法.
    我觉得,你只要理解他们什么时候需要用就可以了...
      

  15.   

    out和ref编译结果都一样,都是传引用,不过在编译检查初始化上不一样,
      

  16.   

    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在方法内是被处理过的.
      

  17.   

    怎么说呢,这俩者都有各自特点。提现于你是侧重赋值还是参照。
    我举2个例子.第一种,调用前不知道如何初始化才好。就拿object类型来说,我只想得到函数返回的结果用于参照,得到类型可能是数也可能字符串也可能是对象类。又或者不知道对象是否初始化,从数据库中抽取的数组中,哪个为被初始化,并不确定。这时用out。
    第二种,函数内部,我要参照,我要使用对象的方法,比方说参数为整数,要判断它长度,我是不是要ToString,但是参数为被初始化的情况下,空对象没有ToString方法会造成异常。这时我用ref.根据具体情况来,两者可以相互替代,就拿第二种来说,你调用ToString前判断下是否为空未被初始化。也能使用out。
    代码越精炼越好,可惜很多公司看着一天多少行代码。“码农"不就这么来的?!
    对不起,我是IT技术男,不是码字男。
    码字??来拳皇PK,告诉什么叫敲键盘速度
      

  18.   

    out表示不能传进,只能传出,ref又能传进又能传出,
      

  19.   

    补充: out可以在方法前初始化,只是方法内会忽略初始化的值,即其值不能被传入.
      

  20.   

    补充: out可以在方法前初始化,只是方法内会忽略初始化的值,即其值不能被传入.
    不能吧,会报错的吧
      

  21.   

    补充: out可以在方法前初始化,只是方法内会忽略初始化的值,即其值不能被传入.
    不能吧,会报错的吧不报错.我调试代码经常这么干的啊
      

  22.   

    简单来说,out和ref传递的都是引用而不是值,out侧重于输出使用之前不需赋值而ref在使用之前需要赋值,另外这两个关键字可以变相实现使一个方法输出多个值