C#字符串的不變性


  看過一些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 }

 

版權聲明

本文為作者原創,版權歸作者雪飛鴻所有。 轉載必須保留文章的完整性,且在頁面明顯位置處標明原文鏈接

如有問題, 請發送郵件和作者聯系。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM