【问题标题】:How resources will be free by Dispose or Finalize?Dispose 或 Finalize 将如何释放资源?
【发布时间】:2023-03-24 10:04:01
【问题描述】:

我有三门课。 1 类、2 类和 3 类。我有循环依赖(class1 到 class2,class2 到 class3,class3 到 class1)。在这种情况下,如何通过 dispose 方法或 finalize() 释放资源?

【问题讨论】:

  • 所有类都实现IDisposable吗?
  • 此外,我相当确定最终确定的顺序是未定义的,这意味着您不会得到准确的答案。你想解决什么问题?你认为你为什么首先需要这些信息?

标签: dispose finalize


【解决方案1】:

当您在一个对象上实现IDisposable 时,您也做出了所有权决定。如果Class1 具有对Class2 的引用,则您必须确定Class1 是否拥有Class2,或者它是否仅存储引用。如果Class1 拥有Class2 并且Class2IDisposable,那么Class1 也应该实现IDisposableClass1 应该在Class2 方法中调用Dispose Dispose,但仅限于@987654335当显式调用时 - 不是在最终确定时。

因为IDisposable 还定义了所有权层次结构,所以您在处置时不能有循环依赖关系。当然Class1 可以拥有Class2 拥有Class3Class3 可以引用Class1 但因为Class3 不拥有Class1 它不应该在引用时调用Dispose处置。

在终结期间,实现 IDisposable 的类只应释放非托管资源,而不应在其拥有的类上调用 Dispose,因为这些实例可能已被垃圾收集器终结。

【讨论】:

  • 我希望 .NET 在封装所有权的引用和不封装所有权的引用之间做出一些区分。虽然在某些情况下无法避免手动Dispose 编码,但确实应该有可能让一个类型指定它“拥有”某些字段,并让编译器提供一种Dispose 所有字段的方法一个对象拥有其类型实现IDisposable
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多