2016-11-18 4 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(); 
     } 

    } 

또는 후드 아래의 체크를 할 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[]입니다.