Dot-Net
.NET 中的結構和類有什麼區別?
.NET 中的結構和類有什麼區別?
在 .NET 中,有兩類類型,引用類型和值類型。
結構是值類型,類是引用類型。
一般的區別是引用類型存在於堆上,而值類型存在於內聯,也就是說,無論它是你的變數或欄位的定義。
包含值類型的變數包含整個值類型值。對於結構,這意味著變數包含整個結構及其所有欄位。
包含引用類型的變數包含一個指針,或對記憶體中實際值所在的其他位置的引用。
這有一個好處,首先是:
- 值類型總是包含一個值
- 引用類型可以包含一個null引用,這意味著它們現在根本不引用任何東西
在內部,引用類型被實現為指針,並且知道這一點並知道變數賦值是如何工作的,還有其他行為模式:
- 將值類型變數的內容複製到另一個變數中,將整個內容複製到新變數中,使兩者不同。換句話說,在複製之後,對一個的更改不會影響另一個
- 將引用類型變數的內容複製到另一個變數中,複製引用,這意味著您現在有兩個對相同的引用在其他地方儲存實際數據。換句話說,在複製之後,更改一個引用中的數據似乎也會影響另一個引用,但這只是因為您實際上只是在兩個地方查看相同的數據
當您聲明變數或欄位時,這兩種類型的區別如下:
- 變數:值類型存在於堆棧中,引用類型存在於堆棧中,作為指向實際記憶體所在的堆記憶體中某處的指針(儘管請注意Eric Lipperts 文章系列:堆棧是一個實現細節。)
- class/struct-field:值類型完全存在於類型內部,引用類型存在於類型內部,作為指向實際記憶體所在的堆記憶體中某處的指針。