处理存储在公共静态字段中的IDisposable对象

如果一个类有一个实现IDisposable的实例字段,那么包含的类实现了IDisposable和类,它从Dispose方法中调用Dispose方法。

public class A : IDisposable { public System.Drawing.Font font = new Font("Arial", 10.0f); public void Dispose() { font.Dispose() } } 

(我知道我没有正确处理配置模式,但是样本代码应该足够好)

如果该字段是静态字段,那么调用字段的Dispose应该在哪里?

 public class B { public static System.Drawing.Font font = new Font("Arial", 10.0f); } 

我可以使B类实现IDisposable并调用font.Dispose但如果稍后再使用B.font会导致问题。 除了你必须记住访问静态方法的dispise,你需要创建一个实例来调用Dispose。

我也可以创建一个静态Dispose方法,但是用户必须记住调用Dispose并且必须确保它们是程序中它的最后一个用户。

加载类型时会初始化静态字段。

因此,从逻辑上讲,卸载包含类型时配置分配给静态字段的对象是有意义的。

但是,类型不会被卸载。 AppDomains周围可能存在一些奇特的复杂问题,但我怀疑这不适用于您的情况。

因此,我不会处置该实例,否则您将拥有一个不适合使用的公共可用对象实例。

如果该字段是静态的,那么可能意图是在应用程序的整个持续时间内持续它? 因为那时只需要在应用程序关闭时进行处理。 这种情况会以这种方式或其他方式发生 – 本身 –

如果您计划在应用程序的生命周期内多次将静态字段重新分配给不同的IDisposable对象,那么当然您需要在重新分配时处置旧对象。 也许你可以使用一个属性? 并不是说我已经考虑了很多,但是有点像:

 // private - don't write to this field from outside the property setter static Font font = new Font("Arial", 10.0f)); public static Font Font { get { return font; } set { var oldFont = font; if (oldFont != null) oldFont.Dispose(); font = value; } } 

你可以像处理任何其他物体一样处理它。 它没有任何区别。 静态对象只是每个类可用的对象。 它仍然是一个例子。 当然,您可能不希望这样做,因为在您处理它之后,某人仍然可以访问它并获得ObjectDisposedExceptionexception。

  static void Main(string[] args) { using (Test.Instance) { } Thread.Sleep(TimeSpan.FromSeconds(10)); } public class Test:IDisposable { public static Test Instance = new Test(); public void Dispose() { Console.WriteLine("Disposed"); } } 

输出是:

弃置

根据您更新的示例:

 public class A { public static System.Drawing.Font font = new Font("Arial", 10.0f)); } 

你可以做A.font.Dispose()using(A.font)

一般来说,我认为这个想法是你真的不会有一个公共的静态一次性领域,因为通过使它静止你暗示它应该在应用程序的生命周期。 如果它必须是一次性的,你应该使它变得懒惰并使其可以线程安全地重新初始化,否则在处理之后访问它将抛出exception。 或者您可以在应用程序结束代码中使用挂钩并安全地处理所有静态一次性用品。 您也可以在某处开始注册您的一次性用品。 只是一个想法

您不能处置静态类,因为它没有实例