Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使迭代器函数在引发异常时返回空引用_.net_Vb.net - Fatal编程技术网

.net 使迭代器函数在引发异常时返回空引用

.net 使迭代器函数在引发异常时返回空引用,.net,vb.net,.net,Vb.net,下面的代码遍历一组处理器并返回它们的ID。硬件探索是危险的,我想让这个功能尽可能稳定 即: 如果在准备迭代时引发异常,则返回空引用;及 如果在迭代过程中抛出异常,只需悄悄跳过此迭代即可 代码: 当前代码未编译,因为禁止在迭代器中使用return 我能想到的最好办法就是用不产生任何东西来代替不返回任何东西。我希望它会导致一个包含一个项的枚举,这是一个空引用。这是我唯一的选择吗 我知道我可以使用一个常规函数,并在完全迭代后返回集合。这是一个使用迭代器s练习的练习。我看不到一种方法可以使迭代器在异

下面的代码遍历一组处理器并返回它们的ID。硬件探索是危险的,我想让这个功能尽可能稳定

即:

  • 如果在准备迭代时引发异常,则返回空引用;及
  • 如果在迭代过程中抛出异常,只需悄悄跳过此迭代即可
代码:

当前代码未编译,因为禁止在
迭代器中使用
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