当集合什么都不是时,我如何处理每个循环,我认为它会跳过但我得到一个例外?
我是否需要将 foreach 循环包装在 if 中以检查任何内容,并且仅当它不是什么内容时才进入 for each 循环?
For Each item As String In MyStringList
'do something with each item but something myStringList will be nothing?
Next
当集合什么都不是时,我如何处理每个循环,我认为它会跳过但我得到一个例外?
我是否需要将 foreach 循环包装在 if 中以检查任何内容,并且仅当它不是什么内容时才进入 for each 循环?
For Each item As String In MyStringList
'do something with each item but something myStringList will be nothing?
Next
我是否需要将 foreach 循环包装在 if 中以检查任何内容,并且仅当它不是什么内容时才进入 for each 循环?
是的。
If MyStringList IsNot Nothing Then
For Each item As String In MyStringList
'do something ...
Next
End If
微软说这是设计使然:
我认为大多数 foreach 循环都是为了迭代非空集合而编写的。如果您尝试通过 null 进行迭代,您应该得到您的异常,以便您可以修复您的代码。Foreach 基本上是一种语法便利。因此,它不应该是“神奇的”并且在引擎盖下做意想不到的事情。我同意建议使用空集合而不是 null 的帖子。(它们通常可以使用单例技术大量重复使用)。
添加If collection IsNot Nothing Then
并不是那么繁重,但是如果您确实有很多这种构造,则此扩展方法可能更可取:
'''---------------------------------------------------------------------
''' Extension Function: OrEmpty
'''
''' <summary>
''' Returns an empty enumeration if the source is Nothing.
''' </summary>
'''
''' <typeparam name="T">The type to create an enumeration of. Normally inferred.</typeparam>
'''
''' <param name="Source">The source enumeration.</param>
'''
''' <returns>The source enumeration unless it is Nothing; then an empty enumeration.</returns>
'''
''' <remarks>
''' </remarks>
'''
''' <revisionhistory>
''' 100930 MEH Created.
''' </revisionhistory>
'''---------------------------------------------------------------------
<Extension()> _
Function OrEmpty(Of T)(ByVal Source As IEnumerable(Of T)) As IEnumerable(Of T)
If Source IsNot Nothing Then _
Return Source
Return Enumerable.Empty(Of T)()
End Function
并且Option Infer On
您不需要指定类型,因此示例使用只是:
For Each item As String In MyStringList.OrEmpty
'do something with each item but something myStringList will be nothing?
Next
我是否需要将 foreach 循环包装在 if 中以检查任何内容,并且仅当它不是什么内容时才进入 for each 循环?
是的,这就是你必须做的。或者确保返回字符串列表的函数(如果你可以控制它)永远不会返回一个空数组而是一个空集合,顺便说一句,这是返回集合的函数的标准方法——它们永远不应该为空,因为它使它们LINQ 不友好,并迫使你到处写 ifs。
If Not IsNothing(collection)
' For Each goes here
End If
另一种选择是使用 if(arg1, arg2)运算符。
For Each item As String In If(MyStringList, New List(Of String)())
'do something .....
Next
if 运算符将返回第二个参数,即空列表,如果第一个参数为空