我正在研究一些扩展方法,我需要将输入集合转换为数组。 我想节省内存,所以我只想创建输入的副本,如果绝对必要的话。
我必须这样做:
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();
}
答案 0 :(得分:4)
ToArray
始终创建副本。您的扩展方法不的行为方式相同。
请注意,这里的类型也存在细微之处。请考虑以下代码:
string[] x = { "a", "b" };
object[] y = x.ExtMethod<object>();
object[] z = x.ToArray<object>();
现在,y
的执行时类型为string[]
,因为它返回了原始数组 - 但z
的执行时类型为object[]
因为它创建了一个新的数组,其中指定了类型参数。