簡體   English   中英

是否可以保證System.Array.Clone()復制值類型?

[英]Is System.Array.Clone() guaranteed to clone value types?

int[] array1 = new[] { 1, 2, 3 };
int[] array2 = (int[])array1.Clone();

array2[0] = 9;

Debug.Assert(array1[0] != array2[0]);

這很好。 Clone()進行淺表復制,但是數組類型是值類型,因此它們也將被克隆。

我的問題是,這是否在語言規范中是明確的,還是僅是當前實現的產物?

我的懷疑是由於System.Array通過運行時泛型在后台“隱形”支持值類型。 查看公共方法,您會希望將值類型裝箱。

之所以起作用,是因為絕對不可能兩個數組共享一個值類型的相同實例。

規范沒有具體說明Array.Clone在值類型上的行為以及在引用類型上的行為。 但是規范確實說,值類型的實例是在賦值時逐位復制的。 因此,當將array1[i]復制到array2[i] ,您將在索引i處獲得實例的克隆。 總是。

但是請記住,如果值類型具有引用類型的字段,則僅引用將被復制,而不是引用類型的實例。

我的查詢是Array可能進行的裝箱是否會否定這一點。 也就是說,將復制帶框的引用,而不是基礎值類型。

即使在克隆過程中將array1[i]裝箱了,也必須將其拆箱,以便最終得到int[]而不是object[] 該值將在拆箱時被克隆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM