我经常有这样的代码:
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这样的代码gotogoto,除了更丑和更难阅读之外,所以我认为这不是一个有效的解决方案。有谁愿意就哪种方法被认为更可取作出答复?
发布于 2009-03-13 21:53:42
如果使用的是C# 3,则始终可以编写扩展方法:
public static IEnumerable<SubItem> SafeSubItems(this ItemType item)
{
return item == null ? Enumerable.Empty<SubItem> : source.SubItems();
}那就写:
foreach (SubItem x in itm.SafeSubItems())
{
// do stuff
}
// do more stuff关键是扩展方法可以被称为偶数"on“空引用。
最好是一个“空安全解引用”操作符,这样我们就可以编写:
// Not valid C# code!
foreach (SubItem x in itm?.SubItems() ?? Enumerable.Empty<SubItem>())
{
}或者只需在EmptyIfNull上定义IEnumerable<T>扩展方法并使用
// Not valid C# code!
foreach (SubItem x in (itm?.SubItems()).EmptyIfNull())
{
}发布于 2009-03-13 21:53:48
您可以使用聚结运算符(编码为双问号?、.net 2以上)。这将返回值列表中的第一个非空值,因此在这个片段中.
MyClass o1 = null;
MyClass o2 = new MyClass ();
MyClass o3 = null;
return o1 ?? o2 ?? o3;...o2将被退回。
这样,您就可以将原始代码示例重新编码为
foreach (type x in (itm ?? emptyArray).subItems())
{
//dostuff
}
//do more stuff不过,就我个人而言,我不介意筑巢。马上就清楚了到底怎么回事。我觉得合并操作符读起来有点难,而这个小窝是为清晰而付出的小小代价。
发布于 2009-03-13 21:43:23
我喜欢少筑巢,对我来说,它读起来更好。请不要去:)
我的方法很短,所以它通常是该场景的返回。
if (itm == null) return;
foreach (type x in itm.subItems())
{
//dostuff
}如果需要更多的东西,这些都是简单的语句,可以在预测之前完成,您可以:
if (itm == null)
{
//do more stuff
return;
}
foreach (type x in itm.subItems())
{
//dostuff
}如果上述情况不是这样的话,那么这个方法很可能太长了,而且其中一些方法无论如何都会被移走。可能:
if( itm != null ) SomeActionOnSubItems(itm.subItems);
// do more stuff (can be some method calls depending on level of abstraction).https://stackoverflow.com/questions/644715
复制相似问题