在作为数组的ICollection上调用.toArray()是否返回引用或副本?

时间:2016-11-18 09:26:55

标签: c# arrays casting extension-methods

我正在研究一些扩展方法,我需要将输入集合转换为数组。 我想节省内存,所以我只想创建输入的副本,如果绝对必要的话。

我必须这样做:

 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();
    }

1 个答案:

答案 0 :(得分:4)

ToArray 始终创建副本。您的扩展方法的行为方式相同。

请注意,这里的类型也存在细微之处。请考虑以下代码:

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

现在,y的执行时类型为string[],因为它返回了原始数组 - 但z的执行时类型为object[]因为它创建了一个新的数组,其中指定了类型参数