代码如下:   class Program
    {
        static void Main(string[] args)
        {
            Animal a1 = new Animal("a1");
            Animal a2 = new Animal("a2");            exchange(a1, a2);
            Console.WriteLine("a1:" + a1.Name + "; a2:" + a2.Name);            Console.Read();
        }        static void exchange(Animal a1, Animal a2)
        {
            Animal temp = new Animal();
            temp = a1;
            a1 = a2;
            a2 = temp;     
        }    }    public class Animal
    {
        private string name;        public string Name
        {
            get { return name; }
        }        public Animal(string n)
        {
            name = n;
        }        public Animal()
        { }
    }既然Animal对象是引用类型,并且C#是按引用传递参数,为什么调用函数之后a1和a2对象的值并没有交换,而是保持不变? 

解决方案 »

  1.   

    如果加上ref 用引用参数来传递就可以交换 但C#不是默认将对象看做引用类型吗? 为什么这里不通? 
    帮忙看看啊
      

  2.   

    static void exchange(Animal a1, Animal a2)
      {
      Animal temp = new Animal();
      temp = a1;
      a1 = a2;
      a2 = temp;   
      }------------》
            static void exchange(Animal a1, Animal a2)
            {
                Animal temp = a1.Clone();
               
                a1 = a2.Clone();
                a2 = temp.Clone();
            }
    public class Animal:ICloneable
        {
            private string name;        public string Name
            {
                get { return name; }
            }        public Animal(string n)
            {
                name = n;
            }        public Animal()
            { }
            public object Clone()
            {
                Animal ret = new Animal();
                ret.Name = this.Name;
                return ret;
            }      
        }
      

  3.   

    using System;class Program
    {
      static void Main(string[] args)
      {
        Animal a1 = new Animal("a1");
        Animal a2 = new Animal("a2");    exchange(a1, a2);
        Console.WriteLine("a1:" + a1.Name + "; a2:" + a2.Name);    Console.Read();
      }  static void exchange(Animal a1, Animal a2)
      {
        string temp = a1.Name;
        a1.Name = a2.Name;
        a2.Name = temp;  
      }
    }public class Animal
    {
      private string name;  public string Name
      {
        get { return name;  }
        set { name = value; }
      }  public Animal(string n)
      {
        name = n;
      }  public Animal()
      {}
    }
      

  4.   


    //a1,a2指向调用处的2个对象
    static void exchange(Animal a1, Animal a2)
    {
    Animal temp = new Animal();//不用实例化,多余
    temp = a1;//temp指向a1的对象
    a1 = a2;//a1这个形参(本函数内有效的一个引用类型变量,指向参数1的对象)指向a2的对象
    a2 = temp;//a2指向temp的对象
    //关键是a1,a2都是对象的引用。而不是引用的引用
    }static void exchange(ref Animal a1, ref Animal a2)
    这才是引用的引用。没看懂?仔细琢磨。
      

  5.   

    问题的关键:
    C#的引用和C++的引用有很大的区别。
    C#的引用相当于指针,引用之间互相赋值只是地址的相互传递而不会影响到引用的内存中的对象。而C++则不同,对初始化的引用赋值相当于给实际被引用的对象赋值。
    因此,以上temp = a1; a1 = a2; a2 = temp;这几句只是地址之间的相互赋值,并不会改变主函数中的对象。相应的如果是给a1的成员a1.Name赋值,则会修改实际对象的值。