首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#代码简化查询: Null容器和Foreach循环

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

Stack Overflow用户
提问于 2009-03-13 21:39:39
回答 4查看 4.1K关注 0票数 12

我经常有这样的代码:

代码语言:javascript
复制
if (itm != null)
{
    foreach (type x in itm.subItems())
    {
        //dostuff
    }
}
//do more stuff

在省略//do more stuff的情况下,很容易避免额外的foreach循环。通过使用适当的命令退出作用域(取决于发生了什么,这通常意味着一个return语句或一个continue statement)。

这种类型的东西往往会产生箭头代码。我现在有几种方法来处理这个问题:

  • 使用像itm = itm == null ? itm.subItems() : emptyArray这样的代码
  • 允许箭头代码
  • 使用goto
  • 使用邪恶的范围攻击(在一个作用域中封装整个事件,如果是语句,然后突破它)。在我看来,邪恶的范围攻击基本上等同于goto,除了更丑和更难阅读之外,所以我认为这不是一个有效的解决方案。
  • 将部分块重构为新方法。事实上,有几种情况下,这可能是是一个很好的解决方案,但大多数情况下并不合适,因为空引用主要是来自MS-函数的错误条件。

有谁愿意就哪种方法被认为更可取作出答复?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-03-13 21:53:42

如果使用的是C# 3,则始终可以编写扩展方法:

代码语言:javascript
复制
public static IEnumerable<SubItem> SafeSubItems(this ItemType item)
{
     return item == null ? Enumerable.Empty<SubItem> : source.SubItems();
}

那就写:

代码语言:javascript
复制
foreach (SubItem x in itm.SafeSubItems())
{
    // do stuff
}
// do more stuff

关键是扩展方法可以被称为偶数"on“空引用。

最好是一个“空安全解引用”操作符,这样我们就可以编写:

代码语言:javascript
复制
// Not valid C# code!
foreach (SubItem x in itm?.SubItems() ?? Enumerable.Empty<SubItem>())
{
}

或者只需在EmptyIfNull上定义IEnumerable<T>扩展方法并使用

代码语言:javascript
复制
// Not valid C# code!
foreach (SubItem x in (itm?.SubItems()).EmptyIfNull())
{
}
票数 15
EN

Stack Overflow用户

发布于 2009-03-13 21:53:48

您可以使用聚结运算符(编码为双问号?、.net 2以上)。这将返回值列表中的第一个非空值,因此在这个片段中.

代码语言:javascript
复制
MyClass o1 = null;
MyClass o2 = new MyClass ();
MyClass o3 = null;
return o1 ?? o2 ?? o3;

...o2将被退回。

这样,您就可以将原始代码示例重新编码为

代码语言:javascript
复制
foreach (type x in (itm ?? emptyArray).subItems())
{
    //dostuff
}

//do more stuff

不过,就我个人而言,我不介意筑巢。马上就清楚了到底怎么回事。我觉得合并操作符读起来有点难,而这个小窝是为清晰而付出的小小代价。

票数 3
EN

Stack Overflow用户

发布于 2009-03-13 21:43:23

我喜欢少筑巢,对我来说,它读起来更好。请不要去:)

我的方法很短,所以它通常是该场景的返回。

代码语言:javascript
复制
if (itm == null) return;
foreach (type x in itm.subItems())
{
   //dostuff
}

如果需要更多的东西,这些都是简单的语句,可以在预测之前完成,您可以:

代码语言:javascript
复制
if (itm == null)
{
   //do more stuff 
   return;
}
foreach (type x in itm.subItems())
{
   //dostuff
}

如果上述情况不是这样的话,那么这个方法很可能太长了,而且其中一些方法无论如何都会被移走。可能:

代码语言:javascript
复制
if( itm != null ) SomeActionOnSubItems(itm.subItems);
// do more stuff (can be some method calls depending on level of abstraction).
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/644715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档