为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
RISEBY 2021-05-19 14:01:15
我阅读了类似问题的公认答案,部分答案是:当结构作为参数传递时,它们按值传递:它们被复制。现在,您有两个具有相同内部字段的结构,它们都将尝试清理同一对象。一个将首先发生,因此之后使用另一个的代码将开始神秘地失败...然后其自身的清理将失败这不是同样的问题Dispose()吗?如果结构可以实现IDisposable,则不允许它们具有终结器的原因是什么?如果终结器的全部目的是要Dispose(false)在程序员忘记调用的情况下调用Dispose(),而结构可以具有IDisposable.Dispose(),那么为什么不允许结构的终结器但允许它们用作引用类型呢?
查看完整描述

2 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

这不是同样的问题Dispose()吗?

有点,但不是全部。具体来说,“然后其自身的清理将失败”是可能的,但不太可能,因为Dispose()必须安全地在同一对象上多次调用,并且在同一对象的不同副本上多次调用通常不是问题。

如果结构不能有终结器,为什么要允许它们实现IDisposable

允许它是自然行为;它为语言提供了更简单的规则。由于这不是程序员可能会偶然出错的东西,因此在编译器中编写额外的代码来拒绝这样做的好处很小。


Jeroen Mostert补充说,它甚至可以使结构实现很有意义IDisposable

IDisposable可能只是因为它是其他一些代码的要求而Dispose()实现的,即使在此特定类型上实现绝对不会做任何事情。在这种情况下,不存在意外调用其他副本的风险。这样的一个例子是当一个struct实现时IEnumerator<T>IEnumerator<T>反过来又实现了IDisposable


查看完整回答
反对 回复 2021-05-23
?
开满天机

TA贡献1786条经验 获得超13个赞

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

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

作为奖励,Dispose通常被用作using模式的一部分。您只为using块创建实例,并保持引用直到Dispose,没有任何怪异。确实,没有理由禁止这样做。


查看完整回答
反对 回复 2021-05-23
  • 2 回答
  • 0 关注
  • 108 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信