out是由内部进行附值(通道)int a=0;
changeval(out a);结果
----
a=123
public void changeval(out int a){
  a=123;
}

解决方案 »

  1.   

    这个是后来版本改的吗?我记得ref修饰的,必须初始化,而out修饰,不能初始化
      

  2.   

    使用的感觉
    ref是方法内部可以不赋值,out是方法内部必须赋值,否则无法编译。
    使用这些修饰符通常都是int,string这些非对象类,如果是对象,根本不需要ref和out,直接内部赋值外部也会改变
      

  3.   

    是不是后来的版本就不懂了,我学.net前他就已经存在了
      

  4.   

    这个我知道,比如你看这个ChangeType(ref Person per)
    {
       per=new Person();
       per.Name="123";
    }
    ChangeType(Person per)
    {
      per=new Person();
      per.Name="123";
    }这两个结果就不一样,我想知道这个为什么不一样,传递的都是地址,这个地址的区别
      

  5.   

    跟VS的版本有关系吗
    使用ref,必须初始化,使用out怎么着都行,但是方法里面必须初始化对吧
      

  6.   

    这个我知道,比如你看这个ChangeType(ref Person per)
    {
       per=new Person();
       per.Name="123";
    }
    ChangeType(Person per)
    {
      per=new Person();
      per.Name="123";
    }这两个结果就不一样,我想知道这个为什么不一样,传递的都是地址,这个地址的区别
    是不一样的
    public void Go()
              {
                 Thing x = new Animal();
               
                 Switcharoo(ref x);
     
                  Console.WriteLine(
                    "x is Animal    :   "
                    + (x is Animal).ToString());
     
                  Console.WriteLine(
                      "x is Vegetable :   "
                      + (x is Vegetable).ToString());
                  
              }
     
               public void Switcharoo(ref Thing pValue)
               {
                   pValue = new Vegetable();
               }
    输出结果:
    x is Animal    :   False
    x is Vegetable :   True
    如果不用ref输出结果刚好相反。
    是因为用了ref之后参数pValue指向栈上的变量x,执行Switcharoo方法后x的通过变量pValue指向了new Vegetable()的地址。而不用ref参数pValue只是栈上的变量x的一个复制。执行Switcharoo方法之后,pValue变成了new Vegetable()的地址,而x依然指向animal这个对象。
      

  7.   

    Quote: 引用 12 楼 kxm_2012 的回复:

    Quote:

    这个是我想要的
      

  8.   

    不加ref时,形参变量指向该实参变量在操作系统栈中的地址,可以理解为是地址的副本,当你new时相当于改变了形参变量所指向的地址,往下的操作对实参就没有影响了;加ref时,形参变量不仅指向该实参变量在操作系统栈中的地址,也指向该实参变量在操作系统堆中的地址,可以理解为实际上就是实参本身,当new时也相当于改变实参本身。
    拙见,继续期待楼下的回答。
      

  9.   

    关于“使用out关键字要求不允许实例化”,没有这样的约束,可能“使用out关键字参数外部不要求实例化,但方法返回之前必须为 out 参数赋值。”更合适些。
      

  10.   

    “out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。”可以借助这句话进一步理解out和ref在使用上面的区别。        public bool CheckUser(string UserName, out string PassWord, out int State)
            {
            if (UserName == "mh_ma")
            {
                PassWord = "123";
                State = 0;
            }
            else
            {
                PassWord = "";
                State = 1;
            }
            return false;
            }这时候我们可以得到三个返回值。