I am working on a few extension methods where I need to transform the input collection into an Array. I want to save memory so I only want to create a copy of the input if it is absolutely necessary.
Do I have to do:
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();
}
}
Or does toArray do the check under the hood and I have exactly the same effect if I do:
public static ICollection<TSource> ExtMethod<TSource>(this ICollection<TSource> source, Func<TSource, int> predicate)
{
TSource[] converted = source.ToArray();
}
ToArray
always creates a copy. Your extension method does not behave the same way.
Note that there are subtleties here around types as well. Consider this code:
string[] x = { "a", "b" };
object[] y = x.ExtMethod<object>();
object[] z = x.ToArray<object>();
Now the execution-time type of y
is string[]
because it's returned the original array - but the execution-time type of z
is object[]
because it's created a new array with the type argument specified.
See more on this question at Stackoverflow