2016-11-18 86 views
2

我的工作,我需要輸入集合轉換成數組數擴展方法。 我想節省內存,所以我只想創建一個輸入副本,如果它是絕對必要的。在作爲數組的ICollection上調用.toArray()是否會返回引用或副本?

我必須做的:

public static ICollection<TSource> ExtMethod<TSource>(this ICollection<TSource> source, Func<TSource, int> predicate) 
    { 
     TSource[] converted; 
     if (source is TSource[]) 
     { 
      converted = source as TSource[]; 
     } 
     else { 
      converted = source.ToArray(); 
     } 

    } 

或根本指定者做引擎蓋下的檢查,我有完全一樣的效果,如果我做的:

public static ICollection<TSource> ExtMethod<TSource>(this ICollection<TSource> source, Func<TSource, int> predicate) 
    { 
     TSource[] converted = source.ToArray(); 
    } 
+2

是不是真的很容易檢查? – Itay

+1

這裏的源:https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,783a052330e7d48d,references點擊'Buffer'和'ToArray'看到在構造函數中發生了什麼,並在最後的ToArray來看看發生了什麼。 –

回答

4

ToArray總是創建複製。您的擴展方法不是的行爲方式相同。

注意,這裏有微妙圍繞類型爲好。考慮以下代碼:

string[] x = { "a", "b" }; 
object[] y = x.ExtMethod<object>(); 
object[] z = x.ToArray<object>(); 

現在的y執行時類型string[]因爲它返回原來的數組 - 但z執行時類型爲object[],因爲它創造了一個新的數組與指定的類型參數

相關問題