gpt4 book ai didi

.net - 为什么 'sealed'会影响IDisposable的实现?

转载 作者:行者123 更新时间:2023-12-02 05:49:43 27 4
gpt4 key购买 nike

阅读答案后here ,我决定将我的类标记为密封,以简化 IDisposable执行。为什么sealed会影响IDisposable的实现(例如GC.SuppressFinalize(this);不需要调用)?请解释发生了什么事。我需要能够向其他开发人员解释为什么我要密封该类。

最佳答案

如果一个类实现 IDisposable未密封,派生类可能需要执行某些操作来响应 Dispose ,但是 Dispose 的基类操作也应该执行。如果该类暴露了 public Dispose成员永远是 IDisposable.Dispose 的同义词,只需使用公共(public)虚拟 Dispose 的隐式接口(interface)实现,就可以在 C# 中实现必要的语义。方法。

这种方法有两个问题:

  1. 在父类公开公共(public)“Dispose”方法的情况下,派生类需要使用不同的方法,而在父类没有公开“Dispose”方法的情况下,则需要派生类使用不同的方法;如果一个不公开“Dispose”方法的类被一个公开“Dispose”方法的未密封类继承,那么事情可能会变得非常困惑。
  2. 某些基本处置代码应在派生类处置代码之前运行(例如,抑制重复“Dispose”尝试的代码),而某些基处置代码应在派生类处置代码之后运行(例如“GC.SuppressFinalize()”)。实现这一点的唯一方法是让非虚拟包装器调用 protected 虚拟函数。请注意,顺便说一句,微软的包装器不能正确抑制重复的“Dispose”,但包装器是此类抑制代码的唯一好地方。

请注意,Microsoft 似乎有意将其 Dispose在基类不重写的情况下使用的模式 Finalize ,但派生类使用 Finalize用于清理。虽然这可能是意图,但这并不是一个好的模式。除了极少数异常(exception),唯一应该重写 Finalize 的类。用于清理的是那些派生自简单类的类,如 Object 。如果一个类实现 IDisposable但不会覆盖 Finalize ,派生类应重写 Finalize 的唯一目的如果 Finalize 则发出警报曾经被调用过,甚至这种用法也是有争议的(更好的模式是:

class whatever:IDisposable{  IDisposable DisposedStatusObject;  // Generate a static dummy object instance we can use as a sentinel value  // It needs to be `IDisposable`, but shouldn't actually hold any resources.  static IDisposable DisposedStatusDisposed = new List<int>().GetEnumerator();  public bool Disposed {get {return (DisposedStatusObject == DisposedStatusDisposed);} }  whatever()  {    DisposedStatusObject = new DisposalAlarm(); // First thing in constructor  }  void Dispose()  {    IDisposable prevStatus;    prevStatus = Interlocked.Exchange(DisposedStatus, DisposedStatusDisposed);    if (prevStatus != DisposedStatusDisposed)    {      Dispose(true);      prevStatus.Dispose();    }  }}

DisposalAlarm()假设类是一个被重写的类 Finalize()如果出现 Finalize() 则发出警报的方法方法在没有 Dispose() 的情况下被调用首先调用的方法。 Dispose方法whatever将确保,如果派生类方法正确返回,则警报将被取消。请注意,如果 whatever 的实例有一个不受抑制的终结器,whatever 的所有内容持有直接或间接引用的对象必须保留,直到终结器运行或被抑制为止。相比之下,添加 DisposalAlarm对象不会延长 whatever 中任何内容的生命周期.

关于.net - 为什么 'sealed'会影响IDisposable的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11024336/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com