新对象[] {}与Array.Empty <object>()

时间:2018-10-30 18:58:25

标签: c# arrays

当我输入以下代码时:

object[] objects = new object[] { };

Visual Studio告诉我:

  

避免不必要的零长度分配。使用Array.Empty()   代替。

使用一个在另一个之上是否有实际含义?

发出警告的原因是什么?

2 个答案:

答案 0 :(得分:6)

您正在创建一个空数组。由于您无法更改数组实例的容量,因此该字段将始终为空(听起来很奇怪,您无法更改它的 length ,我不知道为什么)。每次执行此操作时,都会创建一个永远无法使用的数组实例。大量执行此操作可能会浪费GC和内存压力,从而导致警告。

与其创建空数组,不如建议使用Array.Empty ()。此方法使用此静态类返回一个数组

internal static class EmptyArray<T>
{
    public readonly static T[] Value;

    static EmptyArray()
    {
        EmptyArray<T>.Value = new T[0];
    }
}

由于它是静态且只读的,因此在整个appdomain中只有一个空数组实例。空数组本质上是不可变的,因此缓存实例不是问题。如果发现自己盯着优雅的代码路径来创建大量的空数组,它可以让您在算法中放弃特殊情况下的空数组创建。

Enumerable.Empty ()是Linq to Objects的等效项,对于不浪费空内容的分配也很有用。

答案 1 :(得分:1)

使用Array.Empty有助于避免不必要的内存分配。 请从下面的.NET库本身中引用代码:

[Pure]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public static T[] Empty<T>()
{
    Contract.Ensures(Contract.Result<T[]>() != null);
    Contract.Ensures(Contract.Result<T[]>().Length == 0);
    Contract.EndContractBlock();

    return EmptyArray<T>.Value;
}
...
// Useful in number of places that return an empty byte array to avoid unnecessary memory allocation.
internal static class EmptyArray<T>
{
    public static readonly T[] Value = new T[0];
}

来源:https://referencesource.microsoft.com/#mscorlib/system/array.cs,bc9fd1be0e4f4e70