看過(guò)一些C#教程的人都應(yīng)該知道這句話:“在C#中,一旦對(duì)字符串對(duì)象進(jìn)行初始化,該字符串對(duì)象就不能再被該變“。這句話可用簡(jiǎn)單的圖示來(lái)說(shuō)明:
1、聲明變量 string str="first";
在執(zhí)行這句代碼時(shí),首先在棧上開(kāi)辟出一塊兒內(nèi)存空間用于存放變量str,然后在堆上開(kāi)辟出一塊兒空間用于存放字符串對(duì)象"First",str變量存放指向"First"的引用
注意,str只是string類型的變量,不是字符串對(duì)象,堆上的那一坨才是字符串對(duì)象。
2、改變變量str的值,str="Second";
在執(zhí)行這句代碼時(shí),會(huì)在堆上開(kāi)辟出一塊兒新的內(nèi)存空間用來(lái)存放新對(duì)象“Second”,str指向新對(duì)象地址,原來(lái)的對(duì)象“First”并沒(méi)有改變,該對(duì)象在不再被其它變量引用的情況下,將被垃圾回收器回收。
下面使用代碼來(lái)進(jìn)行說(shuō)明(使用ReferenceEquals方法來(lái)判斷字符串變量的引用是否改變):
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;//這時(shí)str01和str02指向托管堆上的同一個(gè)對(duì)象,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:因?yàn)樽址牟豢勺冃裕@里不會(huì)真正的去改變str02的值15 //而是在托管堆上重新分配一塊兒內(nèi)存,然后str02指向這個(gè)新的string對(duì)象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 }
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注