c# - 如果结构可以实现 IDisposable,为什么它们不能有析构函数?
问题描述
我阅读了一个类似问题的接受答案,部分答案是:
当结构作为参数传递时,它们按值传递:它们被复制。现在你有两个具有相同内部字段的结构,它们都将尝试清理同一个对象。一个会首先发生,因此之后使用另一个的代码将开始神秘地失败......然后它自己的清理将失败
同样的问题不适用Dispose()
吗?如果结构可以实现IDisposable
,那么不允许它们具有终结器的原因是什么?
如果终结器的全部目的是Dispose(false)
在程序员忘记调用的情况下调用Dispose()
,并且结构可以具有IDisposable.Dispose()
,那么为什么不允许结构的终结器但允许它们用于引用类型?
解决方案
因为IDisposable
只是一个接口。没有特殊处理。结构可以实现接口,所以它们可以实现IDisposable
.
但是,这并不意味着它没有意义。的目的IDisposable
是释放非托管资源。结构可以具有对非托管资源的引用,这将受益于Dispose
(不用说,该引用本身应该实现IDisposable
并具有终结器)。
作为奖励,Dispose
通常用作using
模式的一部分。您仅为 using 块创建实例,您保留引用直到Dispose
,不涉及怪异。没有理由禁止这样做,真的。
推荐阅读
- android - Kotlin 协程 - 如果一段时间后第一个任务没有完成,则启动另一个任务
- reactjs - 从多个后端加载翻译
- php - PHP SQL On update 从同名的其他行中删除以前的列数据
- vbscript - VBS 将文本复制到剪贴板,不带引号
- java - java.lang.NoClassDefFoundError:解析失败:Lcom/google/android/gms/common/util/zzt;
- javascript - TypeError:无法读取 Redux Todo 应用程序中未定义的属性“映射”
- dart - Dart:我如何获得 Stream 的长度?
- html - 更改引导模式消息正文中的字体大小
- azure - Azure AD 未重定向到 MDM 使用条款 URL
- google-cloud-platform - 获取 Terraform google_monitoring_notification_channel 资源的 Slack auth_token