【发布时间】:2019-12-16 16:02:15
【问题描述】:
我读到了一些关于在 C# 终结器中不要做什么的文章,但我终其一生都找不到链接。
调用析构函数时,在拥有析构函数的类中使用引用对象是否安全?
我相信这就是我正在阅读的内容。但如果是这样的话,析构函数就不能调用 Dispose 方法来清理非托管资源,对吗?
注意:我知道 IDisposable 和常见的实现。
【问题讨论】:
-
经验法则:不要在终结器中做任何事情。有一些可能的用途(例如,如果您忘记返回资源,则可以使用安全网),但它们也值得怀疑。
-
那为什么还要有终结器呢? IF 在终结器中使用任何引用成员对象都是不安全的,这意味着您甚至不能调用引用属性的 Dispose 方法并依赖类的用户来调用 Dispose 或使用 Using声明。
-
您在终结器中处理非托管资源,例如 Win32 句柄。 IIRC 使用托管对象是不安全的,因为它们可能已经被释放了。
-
@R.J.Dunnill 如果我有一个成员引用对象(如 StreamWriter)并想确保它被处理掉怎么办?我真的不能从终结器中这样做吗?
-
如果问题是非托管资源,请记住
IDisposable是您的朋友,并且在对象超出范围后几秒钟内可能不会调用终结器 - 仅在特定的 GC 传递时(这取决于您的垃圾生成,可能或多或少频繁)收集终结器对象。
标签: c# idisposable finalizer