日期:2014-05-16  浏览次数:20953 次

ref和out关键字
不使用ref和out关键字:
值类型传递的是实例的副本,调用方法对其修改不会影响原先的实例
引用类型传递的是对对象的一个引用,我可以理解这个引用也是一个地址的副本吗?
两个地址指向同一个对象,如果对副本地址重新赋值,则修改不会对原先对象造成影响
 
使用ref和out关键字:
值类型传递的是实例的指针,调用方法可以通过指针对其进行修改
引用类型传递的还是对对象的一个引用吧?
如果重新赋值,在修改的话原先对象也会修改?怎么回事?

使用out关键字要求不允许实例化,对于引用类型可以实例化?怎么回事

大神请详细讲解一下呗,上面如果我的哪个观点不对也请指出来,谢谢了
------解决方案--------------------
out是由内部进行附值(通道)

int a=0;
changeval(out a);

结果
----
a=123


public void changeval(out int a){
  a=123;
}




------解决方案--------------------
引用类型传递的是地址,修改副本会对原有对象产生影响,一起变
------解决方案--------------------
使用的感觉
ref是方法内部可以不赋值,out是方法内部必须赋值,否则无法编译。
使用这些修饰符通常都是int,string这些非对象类,如果是对象,根本不需要ref和out,直接内部赋值外部也会改变
------解决方案--------------------
因为,他们本来就是同一个东西
------解决方案--------------------
引用:
Quote: 引用:

引用类型传递的是地址,修改副本会对原有对象产生影响,一起变

这个我知道,比如你看这个

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这个对象。