class Program
    {
        static void Main(string[] args)
        {
            string s1 = "zhang";
            string s2 = "chong";            object o1 = s1, o2 = s2;
            Swap( o1,  o2);            s1 = (string)o1;
            s2 = (string)o2;            Console.WriteLine(s1);
            Console.WriteLine(s2);
            Console.ReadKey();        }
         public void Swap( object a,  object b)
        {
            object t = b;
            b = a;
            a = t;
        }
    }string和object不都是引用类型吗?他们应该可以交换值的啊...这个程序怎么没有交换?必须用ref out???

解决方案 »

  1.   

    public void Swap( object a,  object b)传入的是引用地址,如果没有ref out的话,会复制一个副本出来,比如a1和b1,他们依然指向a和b的地址,如果这时改变了a1和b1的某些属性,在函数结束后a和b的属性也会改变,但是如果改变a1和b1指向的地址,a和b是不会发生改变的
      

  2.   

    不懂了   既然string和object是引用类型   那么他们应该直接指向对象本身啊...怎么可能会传送一个副本...又不是值类型...
      

  3.   

    只有用ref和out才能改变这个地址
      

  4.   

    写了半天,提交没了,fuck csdn
      

  5.   

    using System;
    public class SampleRefType
    {
        public int value;
        
        public static void Main()
    {
        SampleRefType rt = new SampleRefType();
        rt.value = 44;
        ModifyObject(rt);
        Console.WriteLine(rt.value);
    }
    static void ModifyObject(SampleRefType obj)
    {
        obj.value = 33;
    }}
    这个程序又可以交换参数......class....
      

  6.   

    string 是引用类型,但它有它的特殊性
    例如:
    string str = "123";
    string str1 = str;
    str1= "234";//str 这里并没有变 
      

  7.   

    string的赋值运算符被重写了, 让它看起来不像引用类型
      

  8.   

    还不明白, 就看看这个http://blog.csdn.net/LeoMaya/archive/2008/04/27/2335619.aspx
      

  9.   

    引用类型变量只是存储的只是一个地址,这个地址是值实际存放的地址,引用类型的赋值只是将存放值 的地址传给所要赋值的对象。
    在swap(object a,object b)方法中,属于引用传递,只是将地址传给a和b,a和b的值发生交换后,随着方法的结束,a和b的生命周期也随之结束,因而在main方法中的值没有被影响到
      

  10.   

    要想实现LZ想要的结果,知能用REF或out传参了,设置全局变量也可以的嘛