首页 > 解决方案 > 如果结构可以实现 IDisposable,为什么它们不能有析构函数?

问题描述

我阅读了一个类似问题的接受答案,部分答案是:

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

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

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

标签: c#destructoridisposablefinalizer

解决方案


因为IDisposable只是一个接口。没有特殊处理。结构可以实现接口,所以它们可以实现IDisposable.

但是,这并不意味着它没有意义。的目的IDisposable是释放非托管资源。结构可以具有对非托管资源的引用,这将受益于Dispose(不用说,该引用本身应该实现IDisposable并具有终结器)。

作为奖励,Dispose通常用作using模式的一部分。您仅为 using 块创建实例,您保留引用直到Dispose,不涉及怪异。没有理由禁止这样做,真的。


推荐阅读