C#中所有的预定义类型都有对应的CTS类型。C#有15种预定义类型。其中包括13种值类型,和2种引用类型(string和object)。
虽然string是引用类型,但是它有一点不同,请看以下代码:
string s1 = "a";
string s2 = s1;
s1 = "b";
· 第一行:类型为string的s1变量被初始化为”a”.此时在堆上便为s1分配了一个sting对象.s1仅为该对象的引用。
· 第二行:s2和s1指向同一个对象。
· 第三行:修改s1引用对象的值为”b”.此时我们会以为s2指向的对象也变为”b”,但实际上s2指向的对象仍为”a”.其原因可以概括为:
为string类型的引用变量初始化或赋值时,堆上总是会为新值分配一个新对象。所以在上面的例子中,执行第三行后,s1实际已经指向了另一个对象,而s2依然指向原来的对象。