所以我经常遇到这种情况... Do.Something(...)返回一个null集合,如下所示:
int[] returnArray = Do.Something(...);
Run Code Online (Sandbox Code Playgroud)
然后,我试着像这样使用这个集合:
foreach (int i in returnArray)
{
// do some more stuff
}
Run Code Online (Sandbox Code Playgroud)
我只是好奇,为什么foreach循环不能对null集合进行操作?对我来说似乎合乎逻辑的是,0迭代将使用null集合执行...而是抛出一个NullReferenceException.任何人都知道为什么会这样?
这很烦人,因为我正在处理那些不确定它们返回的API,所以我最终if (someCollection != null)到处都是......
编辑:谢谢大家解释foreach使用GetEnumerator,如果没有枚举器,foreach会失败.我想我问为什么语言/运行时在抓取枚举器之前不能或不会进行空检查.在我看来,这种行为仍然会得到很好的定义.
我经常遇到如下代码:
if ( items != null)
{
foreach(T item in items)
{
//...
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,if条件确保foreach块仅在items不为null时才会执行.我想知道这种if情况是否真的需要,或者foreach是否会处理这种情况items == null.
我的意思是,我可以简单地写一下
foreach(T item in items)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
不用担心是否items为空?是if条件多余的?或者这取决于该类型的items或可能的T呢?
我经常有类似这样的代码:
if (itm != null)
{
foreach (type x in itm.subItems())
{
//dostuff
}
}
//do more stuff
Run Code Online (Sandbox Code Playgroud)
在//do more stuff省略的情况下,很容易避免额外的foreach循环.通过使用适当的命令来扩展范围(取决于正在发生的事情,这通常意味着return声明或a continue statement).
这种类型的东西倾向于产生箭头代码.我目前有几种方法可以解决这个问题:
itm = itm == null ? itm.subItems() : emptyArraygotogoto丑陋和难以阅读,所以我不认为这是一个有效的解决方案.有人关心哪些方法被认为更可取?