代码改变世界

C# 值类型和引用类型 说明

2012-01-04 23:26  Rainbow  阅读(300)  评论(0编辑  收藏  举报

说来惭愧,用C# 将近7年了。老是搞糊涂 值类型和引用类型的差别,每次弄明白以后,没多久又给忘了。所以写一个示例,这个示例会一点一点补充,

 

static void Main(string[] args)
        {
            int i = 1;
           
            int j = i;  //基础类型 进行了一次值复制,所以当你改变第二个变量的值时 并不会影响原来变量的值
            j = 2;

            string s1 = "This is s1";       //这个定义是一个极精简的方式,好多人并没有明白这样定义方式后面做了哪些操作。
            string s2 = s1; //string是一个特殊类型,他也会出现值复制现象。当你改变第二个变量的时,并不会影响原来变量的值
            s2 = "This is s2";
            
            Class1 class1 = new Class1();
            //通常我们把上面语句叫做创建一个对象,其实这个语句包含下面4个含义
            //1.右边的“new Class1" ,是以Class1 类为模板,在堆空间中创建一个Class1类对象(简称 Class1 对象)
            //2.末尾的()意味着,创建完Class1 对象,马上调用其构造函数,对刚刚创建对象进行初始化操作。构造函数是必须的,如果没有,C#默认自带。
            //3.左边的Class1 class1 创建了一个Class1类引用变量,以后就是通过这个引用变量来操作刚刚创建的Class1对象。
            //4."=" 操作符使对象引用指向了刚刚那个创建的Class1的内存空间(C++里面的行话就是一个指向Class类型的指针)。这样我们就知道刚刚创建的Class1对象在内存的那个位置了
            //比较容易理解的方式是使用下面这样的形式
            //Class1 class1;  创建一个类型为Class1的引用变量,这个变量只能指向Class1类型的对象,不能指向其他类型的。
            //class1 = new Class1(); 创建一个Class1类的对象。并将内存地址复制给class1 引用变量。

            class1.name = "class1";
            Class1 class2 = class1; //引用类型 不会出现值复制现象,class1和class2 多是指向同一个内存空间的指针,当修改一个的时候,就会影响另外一个
            class2.name = "class2";
            Console.WriteLine(string.Format("i is {0} j is {1}",i.ToString(),j.ToString()));
            Console.WriteLine(string.Format("s1 is {0} s2 is {1}", s1,s2));
            Console.WriteLine(string.Format("class1 name is {0}  class2 name is {1}",class1.name,class2.name));
            //Console.WriteLine(i == i64);
            Console.ReadKey();
        }

输出结果:i is 1 j is 2

     s1 is This is s1  s2 is This is s2

     class1 name is class2  class2 name is class2