一直以來對於值類型和引用類型都只是一個模糊的概念,趁最近有空深入理解了下。 先說說值類型,在msdn上是這樣介紹值類型的。 意思就是值類型直接包含值。 變數引用的位置就是值所在記憶體中實際存儲的位置,所以捏,假如你將一個原始變數的值賦給另一個變數,會在新變數的位置創建原始變數的值的一個記憶體副本。兩個變 ...
一直以來對於值類型和引用類型都只是一個模糊的概念,趁最近有空深入理解了下。
先說說值類型,在msdn上是這樣介紹值類型的。
意思就是值類型直接包含值。
變數引用的位置就是值所在記憶體中實際存儲的位置,所以捏,假如你將一個原始變數的值賦給另一個變數,會在新變數的位置創建原始變數的值的一個記憶體副本。兩個變數是不可能引用同一個記憶體位置滴(除非其中有參數是out 或者ref 參數)。而更改原始變數的值不會影響另一個變數的值,因為變數各有各的存儲位置。如下圖所示(自己畫的有點醜,別介意哈)
翻了下《c#本質論》,很形象生動的描述了下值類型,挺有意思的,一看就懂。
書中說到:值類型的變數就像一張上面寫滿數字的紙。如果要更改數字,可以擦除它並寫上不同的數字。如果還有另外一張紙,就可以把第一張紙上的數字抄過來。但此後,這兩張紙就是獨立的了。在一張紙上面擦除和替換數字不會影響另一張紙上的數字。
什麼是值類型,先看看msdn官方介紹
引用類型的值是對一個對象實例的引用。
引用類型的變數存儲的是引用(通常是記憶體地址),然後通過位置找到對象實例的數據。因為,訪問數據的時候,要從變數中讀取引用,然後根據引用獲取資源,從而到達實際包含實例數據的記憶體位置。
引用類型的變數關聯了兩個存儲位置:直接和變數關聯的存儲位置 和 由變數中存儲的值引用的記憶體位置。
來我們看圖
同值引用類型一樣,看了下書,它是這樣描述道:引用類型的變數也像是一張上面總是寫了東西的紙。例如:假定一張紙上寫了家庭地址"123 Sesame Street,New York City".這張紙是一個變數,地址是一棟建築物的引用。紙和上面寫的地址都不是建築物本身,而且紙在哪裡跟紙上的內容所指向的那棟建築物在哪裡是沒有任何關係。在另一張紙上複製這個引用,兩張紙的內容都指向同一棟建築物。以後將這建築物都變成綠色的了,因為引用指向的是同一個事物。
結:值類型的變數直接存儲實例的數據。而引用類型,需要根據引用來找到實際數據的存儲位置。複製值類型的值會複製所有的數據,這些數據可能很大,而複製引用類型只是複製引用,這個引用是非常小的。所以複製音樂類型的效率更高。
感覺寫個博客啥的更能加深印象,如果有理解不對的地方歡迎指正。
此文參考過:mdcn官方文檔 和《c#本質論(第4版)》