C# 複製數組容易踩到的坑--引用類型與值類型

  筆者近期作的項目裏大量使用了數組,而在使用過程當中,筆者曾經遇到了一個比較低級的問題:如何將一個數組的值賦予另一個數組?(值傳遞?引用傳遞?)當時的應用場景要求筆者使用值傳遞複製數組,筆者很天真地敲上了:int[] a = b; 儘管經過了編譯,可是結果不如筆者所指望。(筆者指望修改另外一個數組,不影響源數組)因而翻閱了dalao們的博客以及官方文檔,找到了緣由:數組屬於引用類型,直接複製至關因而直接將每一個元素的地址複製。因而,抱着避免再犯錯誤的心態,特此摘記:html

   OK,在進入正文以前先上兩個官方文檔傳送門:數組

  簡單抽取上面傳送門的內容htm

C# 中有兩種類型:引用類型和值類型。 引用類型的變量存儲對其數據(對象)的引用,而值類型的變量直接包含其數據。 對於引用類型,兩種變量可引用同一對象;所以,對一個變量執行的操做會影響另外一個變量所引用的對象。 對於值類型,每一個變量都具備其本身的數據副本,對一個變量執行的操做不會影響另外一個變量(in、ref 和 out 參數變量除外;請參閱 in、ref 和 out 參數修飾符)。對象

  簡單概述引用類型與值類型後,筆者又翻閱了關於兩類變量存儲的文檔,找到了這樣的話:blog

引用類型:引用類型存儲在堆(託管堆 Heap)中。類型實例化的時候,會在堆中開闢一部分空間存儲類的實例。類對象的引用仍是存儲在棧中。圖片

值類型:值類型老是分配在它聲明的地方,作爲局部變量時,存儲在棧(堆棧 Stack)上;類對象的字段時,則跟隨此類存儲在堆中內存

OK,先簡單上個StackOverFlow上dalao們討論的問題:文檔

Stack vs Heap

  大意就是:針對上述的變量描述下其分配的空間在哪?

  而後咱們上下面dalao的示例(筆者認爲描述的真的炒雞到位!):

答案

  上面答案大體描述的:方法體內的值類型一般是存放在堆棧(也就是咱們俗稱的棧)中,而引用類型變量以及其包含的值類型變量會一塊兒存放在託管堆中(不是俗稱的堆!不是!),OK再上一個dalao的示例:

dalao的解釋

下面是dalao給對應的代碼作的理解性示意圖:

輸入圖片說明

輸入圖片說明

這裏補充下關於堆棧和託管堆的概念:

託管堆:

託管堆不一樣於堆,它是由CLR(公共語言運行庫(Common Language Runtime))管理,當堆中滿了以後,會自動清理堆中的垃圾,帶來的便利:不須要關心內存釋放的問題

數據結構堆棧: 是一種後進先出的數據結構,即棧 內存堆棧: 存在內存中的兩個存儲區(堆區,棧區)。

  • 棧區:存放函數的參數、局部變量、返回數據等值,由編譯器自動釋放
  • 堆區:存放着引用類型的對象,由CLR釋放

關於這部分知識,有一篇不錯的博客推薦! 傳送門:C# 堆棧和堆 Heap & Stack

OK,回到最開始筆者的問題,假若要作數組的複製怎麼辦?

  1. 若是是引用傳遞,能夠直接將數組變量經過'='賦值
  2. 若是是值傳遞的話,那麼可使用 Array.Copy() 方法或者是Buffer.BlockCopy(),也能夠經過數組變量.Clone()或者是Copy()方法

PS:附上關於值類型變量默認值的說明:默認值表(C# 參考)

好的,就先記錄到這!

相關文章
相關標籤/搜索