如果从 IEnumerator.MoveNext() 或 .Current 引发异常,是否仍必须处理该异常?
直觉上我认为是的,但我不确定是否有一些我不知道的约定。
Intuitively I think yes, but I'm not sure if there's some convention I don't know about.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
由于我们不知道具体的实现是什么,唯一安全的答案是“是”。
然而,直接使用
IEnumerator
的情况很少 -foreach
更为常见。对于通用IEnumerator
您可以使用 using 语句:即使没有通用版本,您也可以作弊:
如果它是 IDisposable,它将处理 iter
Since we can't know what the implementation is, the only safe answer is "yes".
However, it is very rare to use
IEnumerator
directly -foreach
being more common. For the genericIEnumerator<T>
you can use a using statement:Even without the generic version, you can cheat:
Which will dispose iter if it is IDisposable
一次性物品必须永远不会被丢弃。[1]
但是它们应该被丢弃。由于
using
块使用finally
子句进行处理,并且无论using
块是正常退出还是通过异常退出,都会执行此操作,因此默认为即使遇到异常也要进行处理。[1] 我想可能会有一个有缺陷的实现,其中持有非托管资源并且没有终结器,但正确的操作是实现终结器。
No disposable object MUST be disposed, ever.[1]
But they should be. As a
using
block uses thefinally
clause to dispose and this is executed whether theusing
block is exited normally or via an exception, the default is to dispose even in the face of an exception.[1] I suppose one could have a buggy implementation where a non-managed resource is held and there is no finaliser, but the correct action there is to implement a finaliser.