我正在研究一些扩展方法,我需要将输入集合转换为数组。 我想节省内存,因此我只想在绝对必要时创建输入的副本。
我必须这样做吗:
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();
}
最佳答案
ToArray
总是创建一个副本。您的扩展方法的行为方式不相同。
请注意,这里的类型也有一些微妙之处。考虑这段代码:
string[] x = { "a", "b" };
object[] y = x.ExtMethod<object>();
object[] z = x.ToArray<object>();
现在,y
的执行时类型是 string[]
,因为它返回原始数组 - 但 z
的执行时类型> 是 object[]
,因为它创建了一个新数组并指定了类型参数。
关于c# - 在作为数组的 ICollection 上调用 .toArray() 是否返回引用或副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40673445/