Home [C# 筆記] string 不可變的特性
Post
Cancel

[C# 筆記] string 不可變的特性

string 字串不可變的特性

  • 當你給字串賦值的時候,舊的資料並不會銷毀,而是在Heap(堆積)重新開辟一塊空間儲存新值,同時也產生很多內存垃圾。(所以,字串一旦聲明了就不再可以改變。)
  • 當程式結束後,GC掃描整個內存,如果發現有的空間沒有被指向,則立即把它銷銷。

int & string

  • int是 ValueType(值類型),string是 ReferenceType(參考類型)。
  • ValueType(值類型)是擺在Stack(堆疊/棧)中,ReferenceType(參考類型)是擺在Heap(堆積/堆)中。

舉例 int 和 string

int類型是Value Type, 是Stack(堆疊/棧)存放資料的記憶體方式。

int 重新賦值後,舊值被覆蓋沒了,變新值

1
2
int n = 10;
n = 20; //10沒了,同一個位置儲20了

string 類型是Reference Type, 是Heap(堆積/堆)存放資料的記憶體方式。

string 重新賦值後,舊值”小明”還在;,只是在heap 中再開辟一塊空間儲存”小王”,s重新指向”小王”

1
2
string s = "小明"; //舊值
s = "小王"; //舊值還在,只是在heap 中再開辟一塊空間儲存新值"小王"

所以如果對string有大量的「重新賦值」、「拼接」、「刪除」,只要每操作一次,只要它的值一發生改變,都會在heap(堆積)中重新開辟一塊空間,就會產生很多的內存垃圾。

先不管它怎麼處理內存垃圾,GC(堆積)都會把在heap中沒有指向的值銷毀

GC什麼時候做呢?

當程式結束後,GC會掃描整個內存,如果發現在有空間沒有被指向,則立即把它銷毀。

垃圾回收:Garbage Collection,縮寫為GC
Stack(堆疊/棧), Heap(堆積/堆)
內存/記憶體空間

如果兩個字串都儲存相同的值呢?

1
2
string s1 = "小明";
string s2 = "小明";

s1和s2 在Stack中,都是指向同一塊Heap空間

當s1 改為”張三”後,會重新賦值,Heap會開辟一個新的空間叫”張三”,s1重新指向它

怎麼驗証它?

在即時運算視窗輸入 & s1 & s2

1
2
3
4
5
6
7
& s1
0x000000340897e5d8 //佔存地址
    *& s1: 0x000001abaddeca58 //追蹤地址
& s2
0x000000340897e5d0
    *& s2: 0x000001abaddeca58

追蹤地址是一樣的

R Note

可以對它理解,每對string 重新賦值,加一個字符,減一個字符…等等,每一個任何操作,只要操作一次,就會在內存當中開辟一塊新的空間。

string 只要對它有任何的操作,就會在內存(記憶體空間)當中開辟一塊新的空間。

參考類型(ReferenceType): 裝箱(Boxing) & 拆箱(Unboxing)

Boxing(裝箱)
將堆疊(stack)中的值複製到堆積(heap)中的行為,就叫Boxing(裝箱)。

Unboxing(拆箱)
反過來說,將堆積(heap)中的值,複製到堆疊(stack)中的行為,就叫Unboxing(拆箱)。

This post is licensed under CC BY 4.0 by the author.