值型別與引用型別
在c#裡面只存在兩種變數型別,一種是值型別另一種是引用型別。
c#的值型別包括了結構體和列舉,而引用型別則是指類。
也就是說除了object、類、列舉、結構體之外c#沒有其他的資料型別了。
至於值型別與引用型別的區別,我要好好說明一下,兩個值型別在進行賦值操作的時候,系統將會將他們的值複製:
也就是說
//在下面的操作當中,i的值將會完整的複製到b中int i=10
;int b=i;
而引用型別,只能進行引用(對於引用型別而言,在進行引用操作的時候,系統會將類裡面的非引用型別進行複製,而引用型別則是引用)
//假設我定義了乙個類cls
//下面進行類初始化
cls a = new cls("
asd"
);//
在宣告乙個cls類
cls b = a;
在這個操作當中,a不會進行複製操作,而是b直接引用了a這個物件,在記憶體也就僅僅告訴系統,b是a的別名而已,舉個例子:神舟電腦實際上是藍天代工的,只不過是貼個牌子。也許比較難理解,但是我們會在以後慢慢強調。
上面說的引用型別與值型別在賦值的時候會進行怎樣的操作,下面就要說說這兩者在記憶體中的區別。
由於值型別是在記憶體棧(stack)中,使用的是一級快取,所以值型別的讀取以及複製都非常的快,而引用型別使用的則是堆(heap),所用到的快取也只是二級快取讀取速度相對慢得許多,因此在處理類的時候我們一般不推薦深度複製(也就是將整個例項的複製),深度複製實際上也比較難寫。最多只是使用icloneable實現以下淺複製。
而且引用型別占用的記憶體也相對較大。
(編者注:引用型別以及值型別的對比目前只想說那麼一點,因為這是貫徹始終的知識,在這裡深談沒有太大的意義,在後續更新的隨筆裡面我會一一強調,同樣的寫到後面的時候如果我覺得有需要補充的東西,我都會返回來更新的撒 ^_^)
[文章引用]
c#例項複製和深度複製的實現
堆疊
c#物件的淺拷貝與深拷貝
關於shell變數的測試與內容替換
參考資料 鳥哥的私房菜 linux基礎學習篇 第三版 在 鳥哥的私房菜 linux基礎學習篇 第三版 第11章中,鳥哥關於變數的測試與內容替換中,鳥哥最後用範例說明了變數替換中 三種特殊符號的用法。看完這些例程,給我最大的感受就是var 或者var 或者var 的變數替換就與c語言中唯一的三目運算子...
變數的高階
cpu,記憶體,硬碟 值,理解為實體的資料 變數,理解為資料的稱呼 每乙個值被創造出來,都會有乙個記憶體id號碼。類似於人的身份證號碼。賦值操作 變數 值 a hello 本質是讓乙個變數名稱指向數值的記憶體位址 我們後面使用變數時,對應記憶體位址的資料就會被使用 函式傳參的本質 函式呼叫時,實參給...
python 函式的高階內容
python的函式也是一種值,所有函式都是function 物件,這意味著可以把函式本身賦值給變數,就像把整數 浮點數 列表 元組賦值給變數一樣 定義乙個計算乘方的函式 def pow base,exponent result 1 for i in range 1,exponent 1 result...