相关疑难解决方法(0)

当collection为null时,为什么.NET foreach循环抛出NullRefException?

所以我经常遇到这种情况... 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会失败.我想我问为什么语言/运行时在抓取枚举器之前不能或不会进行空检查.在我看来,这种行为仍然会得到很好的定义.

.net c#

218
推荐指数
7
解决办法
11万
查看次数

在foreach(项目中的T项目)之前if(items!= null)是多余的吗?

我经常遇到如下代码:

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呢?

c# iteration foreach iterator

87
推荐指数
5
解决办法
4万
查看次数

C#代码简化查询:Null容器和Foreach循环

我经常有类似这样的代码:

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() : emptyArray
  • 允许箭头代码
  • 使用 goto
  • 使用邪恶的范围黑客(包括整个事物,如果声明在一个范围内,然后突破它).在我看来,邪恶的范围黑客基本上等同于goto丑陋和难以阅读,所以我不认为这是一个有效的解决方案.
  • 将一些块重构为新方法.实际上有一些情况下这可能一个很好的解决方案,但大多数情况下它并不合适,因为空引用主要是来自MS函数的错误条件.

有人关心哪些方法被认为更可取?

c#

12
推荐指数
1
解决办法
3968
查看次数

标签 统计

c# ×3

.net ×1

foreach ×1

iteration ×1

iterator ×1