如果从 IEnumerator.MoveNext() 或 .Current 引发异常,是否仍必须处理该异常?

发布于 2024-10-07 06:54:02 字数 34 浏览 4 评论 0原文

直觉上我认为是的,但我不确定是否有一些我不知道的约定。

Intuitively I think yes, but I'm not sure if there's some convention I don't know about.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

别念他 2024-10-14 06:54:02

由于我们不知道具体的实现是什么,唯一安全的答案是“是”。

然而,直接使用 IEnumerator 的情况很少 - foreach 更为常见。对于通用 IEnumerator 您可以使用 using 语句:

using(var iter = obj.GetEnumerator()) {
    ...
}

即使没有通用版本,您也可以作弊:

IEnumerator iter = obj.GetEnumerator();
using(iter as IDisposable) {
    ...
}

如果它是 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 generic IEnumerator<T> you can use a using statement:

using(var iter = obj.GetEnumerator()) {
    ...
}

Even without the generic version, you can cheat:

IEnumerator iter = obj.GetEnumerator();
using(iter as IDisposable) {
    ...
}

Which will dispose iter if it is IDisposable

小情绪 2024-10-14 06:54:02

一次性物品必须永远不会被丢弃。[1]

但是它们应该被丢弃。由于 using 块使用 finally 子句进行处理,并且无论 using 块是正常退出还是通过异常退出,都会执行此操作,因此默认为即使遇到异常也要进行处理。


[1] 我想可能会有一个有缺陷的实现,其中持有非托管资源并且没有终结器,但正确的操作是实现终结器。

No disposable object MUST be disposed, ever.[1]

But they should be. As a using block uses the finally clause to dispose and this is executed whether the using 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文