看過一些C#教程的人都應該知道這句話:“在C#中,一旦對字符串對象進行初始化,該字符串對象就不能再被該變“。這句話可用簡單的圖示來說明:
1、聲明變量 string str="first";
在執行這句代碼時,首先在棧上開辟出一塊兒內存空間用于存放變量str,然后在堆上開辟出一塊兒空間用于存放字符串對象"First",str變量存放指向"First"的引用
注意,str只是string類型的變量,不是字符串對象,堆上的那一坨才是字符串對象。
2、改變變量str的值,str="Second";
在執行這句代碼時,會在堆上開辟出一塊兒新的內存空間用來存放新對象“Second”,str指向新對象地址,原來的對象“First”并沒有改變,該對象在不再被其它變量引用的情況下,將被垃圾回收器回收。
下面使用代碼來進行說明(使用ReferenceEquals方法來判斷字符串變量的引用是否改變):
1 using System; 2 namespace CwjString 3 { 4 class Demo 5 { 6 static void Main(string[] args) 7 { 8 string str01="str01"; 9 string str02=str01;//這時str01和str02指向托管堆上的同一個對象,str01和str02有著相同的引用10 System.Console.WriteLine("str01和str02是否有相同的引用?{0}",ReferenceEquals(str01,str02));11 System.Console.WriteLine("str01={0},str02={1}",str01,str02);12 13 //改變str02的值14 //PS:因為字符串的不可變性,這里不會真正的去改變str02的值15 //而是在托管堆上重新分配一塊兒內存,然后str02指向這個新的string對象16 str02="str02";17 System.Console.WriteLine("str01和str02是否有相同的引用?{0}",ReferenceEquals(str01,str02));18 System.Console.WriteLine("str01={0},str02={1}",str01,str02);19 }20 }21 }
新聞熱點
疑難解答