[英]how do extension methods like .ToList() and .Reverse() look behind the covers?
[英]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.