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