我有一些代码可以返回一个对象数组。
这是一个简化的例子:
string[] GetTheStuff() {
List<string> s = null;
if( somePredicate() ) {
s = new List<string>(); // imagine we load some data or something
}
return (s == null) ?
new string[0] :
s.ToArray();
}
问题是,new string[0]
有多贵?
我是否应该只返回 null 并让调用者接受 null 作为指示“未找到任何内容”的有效方式?
注意:这是在一个循环中调用的,该循环运行了数百次,所以这是我认为这种优化实际上不是“过早”的少数情况之一。
PS:即使为时过早,我仍然想知道它是如何工作的:-)
更新:
最初当我问它是否使用任何空间时,我是从“C/C++”的角度思考问题,有点像在 C 中如何编写 char a[5];
将在堆栈上分配 5 个字节的空间,而 char b[0];
将分配 0 个字节。
我意识到这不适合 .NET 世界,但我很好奇这是否是编译器或 CLR 会检测和优化的东西,因为大小为零的不可调整大小的数组真的不应该(据我所知?)需要任何存储空间。
最佳答案
即使它被“成百上千”次地调用,我也会说这是一个不成熟的优化。如果结果作为空数组更清晰,请使用它。
现在给出实际答案:是的,一个空数组需要一些内存。它有正常的对象开销(我相信在 x86 上是 8 个字节)和 4 个字节用于计数。我不知道除此之外还有什么,但它不是完全免费的。 (虽然它非常便宜...)
幸运的是,您可以在不影响 API 本身的情况下进行优化:拥有一个空数组的“常量”。如果您允许的话,我做了另一个小改动以使代码更清晰...
private static readonly string[] EmptyStringArray = new string[0];
string[] GetTheStuff() {
if( somePredicate() ) {
List<string> s = new List<string>();
// imagine we load some data or something
return s.ToArray();
} else {
return EmptyStringArray;
}
}
如果您发现自己经常需要它,您甚至可以创建一个带有静态成员的泛型类来返回一个正确类型的空数组。 .NET 泛型的工作方式使这变得微不足道:
public static class Arrays<T> {
public static readonly Empty = new T[0];
}
(当然,您可以将其包装在一个属性中。)
然后只需使用:Arrays
编辑:我刚刚想起Eric Lippert's post on arrays .您确定数组是最适合返回的类型吗?
关于c# - .NET 中的空数组是否使用任何空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/151936/