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

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

    }

或者 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/

相关文章:

javascript - 使用 .NET/C# 与使用 HTML/JavaScript 构建 Android 应用程序

javascript - 在字符串中的一些随机数字后面添加空格

gcc - 类型转换时更改对齐要求

string - 配置单元转换为日期dd-MM-yyyy

c# - 从范围 'x.Sub' 引用类型为 'SubType' 的变量 '' 但未定义错误

c# - 在 ASP.NET Core Web Api 中将初始化步骤放在哪里?

c# - centos 8 中 docker build net core 5.0 报错 NET SDK is not installed

php - 我有一个 SQL 表。对于 PHP 的 SQL 请求,我想将该请求的结果存储在变量中。

C:为什么我仍然可以访问空数组?

c++ - 计算距对象起点的距离时,_ATL_PACKING 常量有什么用?