当我输入以下代码时:
object[] objects = new object[] { };
Visual Studio告诉我:
避免不必要的零长度分配。使用Array.Empty() 代替。
使用一个在另一个之上是否有实际含义?
发出警告的原因是什么?
答案 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
答案 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