.net 使迭代器函数在引发异常时返回空引用
下面的代码遍历一组处理器并返回它们的ID。硬件探索是危险的,我想让这个功能尽可能稳定 即:.net 使迭代器函数在引发异常时返回空引用,.net,vb.net,.net,Vb.net,下面的代码遍历一组处理器并返回它们的ID。硬件探索是危险的,我想让这个功能尽可能稳定 即: 如果在准备迭代时引发异常,则返回空引用;及 如果在迭代过程中抛出异常,只需悄悄跳过此迭代即可 代码: 当前代码未编译,因为禁止在迭代器中使用return 我能想到的最好办法就是用不产生任何东西来代替不返回任何东西。我希望它会导致一个包含一个项的枚举,这是一个空引用。这是我唯一的选择吗 我知道我可以使用一个常规函数,并在完全迭代后返回集合。这是一个使用迭代器s练习的练习。我看不到一种方法可以使迭代器在异
- 如果在准备迭代时引发异常,则返回空引用;及
- 如果在迭代过程中抛出异常,只需悄悄跳过此迭代即可
迭代器中使用return
我能想到的最好办法就是用不产生任何东西
来代替不返回任何东西
。我希望它会导致一个包含一个项的枚举,这是一个空引用。这是我唯一的选择吗
我知道我可以使用一个常规函数,并在完全迭代后返回集合。这是一个使用迭代器
s练习的练习。我看不到一种方法可以使迭代器
在异常时返回空集合,如果这是您真正想要做的。如果您这样做了,您可以停止使用迭代器
和Yield
,只需这样做即可
作为IEnumerable(字符串的)的公共只读属性ProcessorId实现IHardwareIds.ProcessorId
得到
尝试
使用s作为新的ManagementObjectSearcher(新的SelectQuery(“Win32\U处理器”))
返回(管理对象的)类型的s.Get()。选择(函数(o)o(“ProcessorId”).ToString())
终端使用
抓住
返回可枚举的。空(字符串的)
结束尝试
结束
端属性
在不使用迭代器的情况下使用LINQ实际上允许您删除每个的,并简化代码
(如果希望返回null,则几乎相同)
作为IEnumerable(字符串的)的公共只读属性ProcessorId实现IHardwareIds.ProcessorId
得到
尝试
使用s作为新的ManagementObjectSearcher(新的SelectQuery(“Win32\U处理器”))
返回(管理对象的)类型的s.Get()。选择(函数(o)o(“ProcessorId”).ToString())
终端使用
抓住
一无所获
结束尝试
结束
端属性
但是,返回null与其他可枚举函数(如@Anu6is指出的Where
,当任何元素都不满足谓词时返回空集合)的感觉不同
您还可以在出现第一个异常时停止迭代。如果从未命中Yield
,则结果为空集合。我认为这更符合迭代器的精神
作为IEnumerable(字符串的)的公共只读迭代器属性ProcessorId实现IHardwareIds.ProcessorId
得到
尝试
使用s作为新的ManagementObjectSearcher(新的SelectQuery(“Win32\U处理器”))
对于s.Get()中的每个任务单
产量mo(“ProcessorId”).ToString()
下一个
终端使用
抓住
“返回”或“退出”属性
结束尝试
结束
端属性
C#模拟是,而且看起来很干净。另请参见。如果您真的想这样做,我看不到一种方法可以使迭代器在异常时返回空集合。如果您这样做了,您可以停止使用迭代器
和Yield
,只需这样做即可
作为IEnumerable(字符串的)的公共只读属性ProcessorId实现IHardwareIds.ProcessorId
得到
尝试
使用s作为新的ManagementObjectSearcher(新的SelectQuery(“Win32\U处理器”))
返回(管理对象的)类型的s.Get()。选择(函数(o)o(“ProcessorId”).ToString())
终端使用
抓住
返回可枚举的。空(字符串的)
结束尝试
结束
端属性
在不使用迭代器的情况下使用LINQ实际上允许您删除每个的,并简化代码
(如果希望返回null,则几乎相同)
作为IEnumerable(字符串的)的公共只读属性ProcessorId实现IHardwareIds.ProcessorId
得到
尝试
使用s作为新的ManagementObjectSearcher(新的SelectQuery(“Win32\U处理器”))
返回(管理对象的)类型的s.Get()。选择(函数(o)o(“ProcessorId”).ToString())
终端使用
抓住
一无所获
结束尝试
结束
端属性
但是,返回null与其他可枚举函数(如@Anu6is指出的Where
,当任何元素都不满足谓词时返回空集合)的感觉不同
您还可以在出现第一个异常时停止迭代。如果从未命中Yield
,则结果为空集合。我认为这更符合迭代器的精神
作为IEnumerable(字符串的)的公共只读迭代器属性ProcessorId实现IHardwareIds.ProcessorId
得到
尝试
使用s作为新的ManagementObjectSearcher(新的SelectQuery(“Win32\U处理器”))
对于s.Get()中的每个任务单
产量mo(“ProcessorId”).ToString()
下一个
终端使用
抓住
“返回”或“退出”属性
结束尝试
结束
端属性
C#模拟是,而且看起来很干净。另请参见。在设置期间(而不是在迭代期间)处理问题的最佳方法是使用一个处理设置的公共非迭代器包装函数,然后使用一个执行实际迭代的私有迭代器函数
我通常在库ish函数中这样做,我想验证参数,如果你阅读Jon Skeet的EduLinq系列,你会看到他使用这种模式来处理参数验证
一个简化的例子如下:
Public Function GetFooStream(ByVal someArg As Bar) As IEnumerable(Of Foo)
If someArg Is Nothing Then Throw New ArgumentNullException(NameOf(someArg))
Return _GetFooStreamImpl(someArg)
End Function
Private Iterator Function _GetFooStreamImpl(ByVal someArg As Bar) As IEnumerable(Of Foo)
'someArg guaranteed to be non-null here
End Function
Public Function GetFooStream(ByVal someArg As Bar) As IEnumerable(Of Foo)
If someArg Is Nothing Then Throw New ArgumentNullException(NameOf(someArg))
Return _GetFooStreamImpl(someArg)
End Function
Private Iterator Function _GetFooStreamImpl(ByVal someArg As Bar) As IEnumerable(Of Foo)
'someArg guaranteed to be non-null here
End Function