所以我经常遇到这种情况... Do.Something(...)返回一个null集合,如下所示:
int[] returnArray = Do.Something(...);
Run Code Online (Sandbox Code Playgroud)
然后,我试着像这样使用这个集合:
foreach (int i in returnArray)
{
// do some more stuff
}
Run Code Online (Sandbox Code Playgroud)
我只是好奇,为什么foreach循环不能对null集合进行操作?对我来说似乎合乎逻辑的是,0迭代将使用null集合执行...而是抛出一个NullReferenceException.任何人都知道为什么会这样?
这很烦人,因为我正在处理那些不确定它们返回的API,所以我最终if (someCollection != null)到处都是......
编辑:谢谢大家解释foreach使用GetEnumerator,如果没有枚举器,foreach会失败.我想我问为什么语言/运行时在抓取枚举器之前不能或不会进行空检查.在我看来,这种行为仍然会得到很好的定义.
我经常遇到如下代码:
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呢?
有可能以某种方式缩短这种说法吗?
if (obj != null)
obj.SomeMethod();
Run Code Online (Sandbox Code Playgroud)
因为我碰巧写了很多东西而且很烦人.我唯一能想到的就是实现Null Object模式,但这并不是我每次都能做到的,而且它肯定不是缩短语法的解决方案.
和事件类似的问题,在哪里
public event Func<string> MyEvent;
Run Code Online (Sandbox Code Playgroud)
然后调用
if (MyEvent != null)
MyEvent.Invoke();
Run Code Online (Sandbox Code Playgroud) 我在以下方面收到错误System.ArgumentNullException: Value cannot be null.:
foreach (var pmt in payment.NewInvoiceViewModels
.Where(x => x.PaymentReceived != 0) ??
Enumerable.Empty<NewInvoiceViewModel>())
Run Code Online (Sandbox Code Playgroud)
我要做的就是检查payment.NewInvoiceViewModels在我迭代之前为空(如果它为null,则会导致错误).
有没有更好的方法来实现这一目标?
我有以下代码:
IList<object> testList = null;
...
if (testList != null) // <- how to get rid of this check?
{
foreach (var item in testList)
{
//Do stuff.
}
}
Run Code Online (Sandbox Code Playgroud)
有没有一种方法,以避免在if之前foreach?我看到了一些解决方案,但是使用时List,有解决方案IList吗?
我的列表 X 包含一些字符串和 null 值。我正在迭代 foreach 循环以将值绑定到文本框。如果我在列表 X 中得到任何空值,则 foreach 循环将终止并获取空异常如何处理它。
我正在检查 foreach 循环内的条件,但我认为这在逻辑上不正确。
SPList _listObj = web.Lists[new Guid(listID)];
SPListItem item = _listObj.GetItemById(Convert.ToInt32(itemID));
foreach (SPField field in _listObj.Fields)
{
if (field.Title != Null)
{ //do some code}}
Run Code Online (Sandbox Code Playgroud) c# ×6
foreach ×2
null ×2
.net ×1
asp.net ×1
asp.net-mvc ×1
exception ×1
iteration ×1
iterator ×1
null-check ×1