如果结构可以实现IDisposable,为什么它们没有析构函数?

我阅读了类似问题的公认答案,部分答案是:

当结构作为参数传递时,它们按值传递:它们被复制。现在,您有两个具有相同内部字段的结构,它们都将尝试清理同一对象。一个将首先发生,因此之后使用另一个的代码将开始神秘地失败...然后其自身的清理将失败

这不是同样的问题Dispose()吗?如果结构可以实现IDisposable,则不允许它们具有终结器的原因是什么?

如果终结器的全部目的是要Dispose(false)在程序员忘记调用的情况下调用Dispose(),而结构可以具有IDisposable.Dispose(),那么为什么不允许结构的终结器但允许它们用作引用类型呢?


RISEBY
浏览 109回答 2
2回答

慕运维8079593

这不是同样的问题Dispose()吗?有点,但不是全部。具体来说,“然后其自身的清理将失败”是可能的,但不太可能,因为Dispose()必须安全地在同一对象上多次调用,并且在同一对象的不同副本上多次调用通常不是问题。如果结构不能有终结器,为什么要允许它们实现IDisposable?允许它是自然行为;它为语言提供了更简单的规则。由于这不是程序员可能会偶然出错的东西,因此在编译器中编写额外的代码来拒绝这样做的好处很小。Jeroen Mostert补充说,它甚至可以使结构实现很有意义IDisposable:IDisposable可能只是因为它是其他一些代码的要求而Dispose()实现的,即使在此特定类型上实现绝对不会做任何事情。在这种情况下,不存在意外调用其他副本的风险。这样的一个例子是当一个struct实现时IEnumerator<T>,IEnumerator<T>反过来又实现了IDisposable。

开满天机

因为IDisposable只是一个接口。没有特殊处理。结构可以实现接口,因此可以实现IDisposable。但是,这并不意味着没有任何意义。目的IDisposable是释放非托管资源。结构体可以引用非托管资源,而引用将受益于Dispose(不必说,引用本身应实现IDisposable并具有终结器)。作为奖励,Dispose通常被用作using模式的一部分。您只为using块创建实例,并保持引用直到Dispose,没有任何怪异。确实,没有理由禁止这样做。
打开App,查看更多内容
随时随地看视频慕课网APP