class Program
    {
        static void Main(string[] args)
        {
            string name = "text";
            Change(name);
            Person p1 = new Person();
            p1.Name = "text";
            Change2(p1);
            Console.WriteLine("Change={0},Change={1}",name,p1.Name);
            Console.Read();
            
        }
        static void Change(string name)
        {
            name =  "改变";
        }
        static void Change2(Person c1)
        {
        
            c1.Name = "改变";
        }    
    }    
    class Person
    {
        private string name;        public string Name
        {
            get { return name; }
            set { name = value; }
        }        private int age;        public int Age
        {
            get { return age; }
            set { age = value; }
        }
    }
//输出值为:
Change=text,Change1=改变我看到C#图解教程里面都说过:
name和Person 都是引用类型,而在传入方法时,都是进行了值传递
但是同样是引用类型,为什么返回的结果不一样呢?

解决方案 »

  1.   

    name是值类型
    Person是引用类型
      

  2.   

    因为 Change2方法中传递的是Person对象
      

  3.   

    String 虽然是引用类型 不过是不可变的  
    对字符串做一些操作 比如大小写的转换 += 实际上是重新创建了一个字符串
    这也是为什么在做大量字符串拼接的时候要使用StringBuilder 而不用+=
      

  4.   

    关键的是name = "改变";这句,这句话并不是把name原来对象里的内容更改为"改变",而是创建了一个新的String对象,然后把新的String对象赋予name引用,
      

  5.   


    谢谢,因为看书上的说明:string为引用类型,所以一直不是很明白这个误区,原来String是披着引用类型的外衣干着值类型的事情。thanks ^_^