簡體   English   中英

擴展方法如ToArray和ToList是按引用還是按值操作?

[英]Do extension methods like `ToArray` and `ToList` operate by reference or by value?

假設我班上有私人詞典或清單。 我想返回一個只讀的枚舉數,以便其他人可以遍歷列表,但無權修改項目。

我不想返回原始的包裝類,而是返回原始項目/元素的副本。 original.ToList<Type>().GetEnumerator()返回一個包含原始項目引用的列表,還是一個包含原始項目副本的列表?

我應該注意,我還需要建立索引(即按索引訪問項目,但仍然無法對其進行修改)。

這些方法將創建集合的新實例,但項目引用仍將是舊項目。 換句話說,消費者無法更新您的內部收藏,但是他們可以自己更新商品。

假設您具有適當的封裝來修改項目,這種方法將起作用,盡管對於較大的列表來說這會占用大量內存,因為您需要為每個新項目引用分配內存。 這就是為什么通常首選返回包裝器的原因之一:它減少了包裝器類的單個實例所需的額外內存。

ToList()Torray()按值工作。 他們只是將值從原始IEnumerable<>復制到新容器。

但是復制的值很可能是參考。

直接撥打

original.ToList<MyType>()

將創建一個“淺”副本:該列表將是新的,但對象將相同。

如果您希望使用“深層”副本,則可以使用LINQ復制項目,然后再將它們添加到列表中:

original.Select(item => new MyType(item)).ToList()

假設您的類具有一個構造函數,該構造函數接受自身的實例並生成一個副本,類似於C ++的副本構造函數,則這將生成一個對象副本列表。

暫無
暫無

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

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