在foreach循环中检查null

有没有更好的方法来做到以下几点:
在继续循环之前,我需要在file.Headers上检查null

if (file.Headers != null) { foreach (var h in file.Headers) { //set lots of properties & some other stuff } } 

简而言之,如果由于我的代码中发生的缩进级别,在if中写入foreach看起来有点难看。

是会评估的东西

 foreach(var h in (file.Headers != null)) { //do stuff } 

可能?

除了符文的build议外,你可以创build自己的扩展方法:

 public static IEnumerable<T> OrEmptyIfNull<T>(this IEnumerable<T> source) { return source ?? Enumerable.Empty<T>(); } 

那么你可以写:

 foreach (var header in file.Headers.OrEmptyIfNull()) { } 

根据口味改名字:)

假设file.Headers中元素的types是T,你可以这样做

 foreach(var header in file.Headers ?? Enumerable.Empty<T>()){ //do stuff } 

这将创build一个空的enumerable的T如果file.Headers为null。 如果文件的types是你自己的types,我会考虑改变Headers的getter而不是。 null是未知的值,所以如果可能的话,而不是使用null作为“我知道没有元素”,当空实际(/原)应该被解释为“我不知道是否有任何元素”使用空集来显示你知道这里没有任何元素。 这也将是DRY'er,因为你不必经常进行空检查。

编辑作为后续Jons的build议,你也可以创build一个扩展方法改变上述代码

 foreach(var header in file.Headers.OrEmptyIfNull()){ //do stuff } 

在你不能改变getter的情况下,这将是我自己的首选,因为它通过给操作一个名字(OrEmptyIfNull)来更清楚地expression意图,

迭代之前的“if”是好的,那些“漂亮”的语义中很less会使你的代码更不可读。

无论如何,如果压痕干扰你的话,你可以更改如果检查:

 if(file.Headers == null) return; 

并且只有在headers属性中有一个真值时才会到达foreach循环。

我能想到的另一个select是在你的foreach循环中使用null-coalescing运算符,并完全避免空检查。 样品:

 List<int> collection = new List<int>(); collection = null; foreach (var i in collection ?? Enumerable.Empty<int>()) { //your code here } 

(用真实的对象/typesreplace集合)

坦率地说,我build议:只是吸了nulltesting。 nulltesting只是 brfalsebrfalse.s ; 一切都将涉及更多的工作(testing,分配,额外的方法调用,不必要的迭代器上的GetEnumerator()MoveNext()Dispose()等)。

iftesting简单,明显,高效。

我正在使用这些scheme的一个很好的小扩展方法:

  public static class Extensions { public static IList<T> EnsureNotNull<T>(this IList<T> list) { return list ?? new List<T>(); } } 

鉴于头是types列表,你可以做以下事情:

 foreach(var h in (file.Headers.EnsureNotNull())) { //do stuff }