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