Naw*_*waz 87 c# iteration foreach iterator
我经常遇到如下代码:
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
呢?
Vla*_*den 93
你仍然需要检查if(items!= null)否则你会得到NullReferenceException.但是你可以这样做:
List<string> items = null;
foreach (var item in items ?? new List<string>())
{
item.Dump();
}
Run Code Online (Sandbox Code Playgroud)
但你可能会检查它的表现.所以我仍然希望首先使用if(items!= null).
基于Eric的Lippert建议,我将代码更改为:
List<string> items = null;
foreach (var item in items ?? Enumerable.Empty<string>())
{
item.Dump();
}
Run Code Online (Sandbox Code Playgroud)
kjb*_*tel 57
使用C#6,您可以使用新的null条件运算符List<T>.ForEach(Action<T>)
(或您自己的IEnumerable<T>.ForEach
扩展方法).
List<string> items = null;
items?.ForEach(item =>
{
// ...
});
Run Code Online (Sandbox Code Playgroud)
Eri*_*ert 34
这里真正的要点应该是一个序列应该首先几乎不会为空.只需在所有程序中使其成为一个不变量,如果你有一个序列,它永远不会为空.它始终初始化为空序列或其他一些真正的序列.
如果序列永远不为null,那么显然你不需要检查它.
Teo*_*gul 10
实际上@Connect上有一个功能请求:http://connect.microsoft.com/VisualStudio/feedback/details/93497/foreach-should-check-for-null
而且反应非常符合逻辑:
我认为大多数foreach循环都是为了迭代非null集合而编写的.如果你尝试迭代null,你应该得到你的异常,以便你可以修复你的代码.
你总是可以用空列表来测试它...但这是我在msdn网站上找到的
foreach-statement:
foreach ( type identifier in expression ) embedded-statement
Run Code Online (Sandbox Code Playgroud)
如果expression的值为null,则抛出System.NullReferenceException.
归档时间: |
|
查看次数: |
43523 次 |
最近记录: |