如果(Array.Length == 0)

如果一个数组是空的,看起来你不能用“.length”来检查它的长度。 检查数组是否为空的最佳方法是什么?

你可以绝对检查一个空的数组的长度。 但是,如果你试图在空引用上做到这一点,你会得到一个exception。 我怀疑这就是你遇到的。 你可以应付两者:

if (array == null || array.Length == 0) 

如果这不是原因,请给出一个简短但完整的程序来展示问题。 如果这原因,那么值得花点时间确保你理解空引用vs“空”集合/string/不pipe。

是的,为了安全,我可能会这样做:

 if(array == null || array.Length == 0) 

如果长度为空且数组存在,则可以使用.Length == 0,但是确定它不为空?

您可以使用

 if (array == null || array.Length == 0) 

要么

 if (!(array != null && array.Length >= 0)) 

注意!!!!! 为了确保c#将正确执行短路; 你必须比较该对象与NULL之前,你去的儿童比较的对象。

这是最好的方法。 请注意Array是.NET中的一个对象,因此您需要先检查null。

正如其他人已经表示,你可能会得到一个NullReferenceException ,可以通过首先检查引用是否为null来避免。 但是,您需要问自己,检查是否确实是有保证的。 你会这样做,因为参考真的可能是null ,它是null在你的代码中有一个特殊的含义? 或者你会这样做来掩盖一个错误? 问题的本质使我相信这将是后者。 在这种情况下,您真的需要仔细检查代码,并找出为什么参考没有得到正确的初始化。

Jon Skeet正确回答。 只要记住在“IF”中的testing顺序是重要的。 在长度之前检查空值。 我也宁愿把null放在平等的左边…只是我从Java那里得到的一个习惯,使得代码更高效,更快速…我不认为它在今天的很多应用中都很重要,但是这是很好的做法。

if(null == array || array.Length == 0)

你build议的testing是好的,只要数组是初始化的…

马丁。

如果(array.length> 0)

检查数组是否为空,以避免空指针exception

任何语言的逻辑:如果array为null或为空:do ….

你的意思是空的还是空的,两个不同的东西,

如果数组是实例化的,但为空,那么长度是正确的,如果它没有被实例化,那么testingvs null

如果arraynull ,试图解除array.Length将抛出一个NullReferenceException 。 如果你的代码认为null是一个无效的array值,你应该拒绝它并责怪调用者。 一个这样的模式是抛出ArgumentNullException

 void MyMethod(string[] array) { if (array == null) throw new ArgumentNullException(nameof(array)); if (array.Length > 0) { // Do something with array… } } 

如果你想接受一个null数组作为一个指示,不做任何事情或作为一个可选参数,你可能根本不访问它,如果它是空的:

 void MyMethod(string[] array) { if (array != null) { // Do something with array here… } } 

如果要避免在arraynull或长度为零时触摸array ,则可以使用C#-6的空合并运算符同时检查两者。

 void MyMethod(string[] array) { if (array?.Length > 0) { // Do something with array… } } 

多余的长度检查

看起来很奇怪,你把空arrays视为一个特例。 在很多情况下,例如,如果你只是循环访问数组,那么就没有必要把空数组作为一个特例。 当array.Length0时, foreach (var elem in array) {«body»}将不会执行«body» 。 如果你正在处理array == null || array.Length == 0 array == null || array.Length == 0特别是为了提高性能,你可能会考虑留下后代的评论。 否则, Length == 0的检查显得多余。

多余的代码使得理解一个程序变得更加困难,因为阅读代码的人可能会认为每条线都是解决某个问题或实现正确性的必要条件。 如果你包含不必要的代码,读者将会花费永远的努力去找出为什么那行或删除它之前是必要的;-)。