在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议:只是吸了null
testing。 null
testing只是 brfalse
或brfalse.s
; 一切都将涉及更多的工作(testing,分配,额外的方法调用,不必要的迭代器上的GetEnumerator()
, MoveNext()
, Dispose()
等)。
if
testing简单,明显,高效。
我正在使用这些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 }