A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

昨天看winform基础,在示例中 使用到了out,
查看地下MSDN,他们描述是:
out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。

但具体使用上如何选择 out 还是 ref  ,d有点迷糊,求详解,最好有例子

7 个回复

倒序浏览
ref和out这两个关键字都能够提供相似的功效,其作用也很像C中的指针变量。它们的区别是:
1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。
2、使用ref和out时,在方法的参数和执行方法时,都要加ref或out关键字。以满足匹配。
3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。
回复 使用道具 举报
本帖最后由 xiaobai198611 于 2011-11-4 10:52 编辑

out的使用:
  1. class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.               string tmp;    //先声明,但不初始化
  6.            User _user=new User();      
  7.                _user.Name(out tmp);        //调用Name方法
  8.                   Console.WriteLine("{0}",tmp); //这时tmp的值为“小白从屋子走出来”
  9.                  Console.ReadKey(true);

  10.    }
  11.      }

  12.   class User

  13.       {
  14.     public void Name(out string tmps)
  15.            {
  16.        tmps="小白从屋子走出来";
  17.            }

  18.       }
复制代码
结果:小白从屋子走出来
         
ref的使用:
  1. class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.            string tmp="小白从屋子走进去";    //声明并初始化  传入值
  6.                User _user=new User();
  7.                _user.Name(ref tmp);
  8.                Console.WriteLine("{0}",tmp);
  9.                Console.ReadKey(true);
  10.         }
  11.    }

  12.     class User

  13.     {
  14.          public void Name(ref string tmps)
  15.          {
  16.               tmps="小白从屋子走出来";  //传出值
  17.          }
  18.     }
复制代码
结果:小白从屋子走出来

         两者的区别用一句通俗话说:ref是有进有出,而out是只出不进

回复 使用道具 举报
out可以方法传出多个值,而且不需要先赋值,赋值了也没用,因为必须在方法内给他赋值
ref需要先赋值,你再根据你的需要,来选择使用哪个方式
回复 使用道具 举报
在具有out参数的方法中,必须对out参数进行赋值,但是ref参数就不需要,在方法中没有给out参数赋值之前是不能使用这个参数进行运算的。总之out侧重于输出,ref侧重于修改
回复 使用道具 举报
“out 未必有进,但和 ref 一样一定有出” 请楼主理解这句话后就会明白!要么看下以前有位曾经发帖过,我写过一个代码的回复。
回复 使用道具 举报
夏雪锐 黑马帝 2011-11-4 18:04:14
7#
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。例如:
class RefExample
{
    static void Method(ref int i)
    {
        i = 44;
    }
    static void Main()
    {
        int val = 0;
        Method(ref val);
        // val is now 44
    }
}

传递到 ref 参数的参数必须最先初始化。这与 out 不同,后者的参数在传递之前不需要显式初始化。
你把 int val = 0;写成int val;就不会编译通过

out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。例如:

class OutExample
{
    static void Method(out int i)
    {
        i = 44;
    }
    static void Main()
    {
        int value;
        Method(out value);
        // value is now 44
    }
}
尽管作为 out 参数传递的变量不必在传递之前进行初始化,但需要调用方法以便在方法返回之前赋值。

尽管 ref 和 out 在运行时的处理方式不同,但在编译时的处理方式相同。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的,因此将不会编译以下代码:

    public void SampleMethod(ref int i) {  }
    public void SampleMethod(out int i) {  }
但是,如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两个参数,则可以进行重载,如下例所示:

    public void SampleMethod(int i) {  }
    public void SampleMethod(ref int i) {  }
---------------------------------------------------------------------------------------------------------------------------------------------------------------------MSDN说得太好太详细了!!!
回复 使用道具 举报
毕山山 黑马帝 2011-11-22 17:26:45
8#
你从网上找本书叫<<你必须知道的.NET>>,那本书从原理上讲的很好,我个人推荐买本纸质的,会学到很多东西,尤其是内存的分配部分讲的非常好.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马