当我输入以下代码时:
object[] objects = new object[] { };
Visual Studio 告诉我:
避免不必要的零长度分配。 使用
Array.Empty<object>()
代替。
使用它们之一是否有任何实际影响?
为什么会出现这个警告?
Array.Empty<T>()
即可。该方法返回使用此静态类的数组。internal static class EmptyArray<T>
{
public readonly static T[] Value;
static EmptyArray()
{
EmptyArray<T>.Value = new T[0];
}
}
Enumerable.Empty<T>()
是用于 Linq to Objects 的等效语法,同时也适用于不浪费内存分配来创建空对象的情况。static
和readonly
的,它只会创建一个空数组的实例…让我想到了我们团队一直在处理的巨型应用程序内部潜在问题。遗憾的是,Visual Studio没有为其修复提供解释。 - Niklas使用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
这是一个指向微软参考源代码的链接,其中包含有关数组类的信息。
Array.Empty()
都会返回同一个数组,而你的代码会创建多个数组。这可能是为了避免不必要的开销。 - user47589