.net 如何正确使用实现IDisposable的静态属性?

.net 如何正确使用实现IDisposable的静态属性?,.net,static,idisposable,.net,Static,Idisposable,例如: using (Brushes.Black) { ... } 这不是一个好主意,因为它是静态的。下次你的应用程序使用Brush.Black时,你会遇到问题,因为它已被处理 现在,如果您只使用Brush.Black,那么不处理它可能没问题,因为您只留下一个非托管资源(希望如此!) 但是,一般来说,您应该避免使用大量的静态IDisposables,还是我遗漏了什么?通常只使用它们,让框架类担心如何处理它们 它们就在那里,这样您就可以使用它们,而无需每次都创建和处理它们。每一个都是在您第一次使

例如:

using (Brushes.Black)
{
...
}
这不是一个好主意,因为它是静态的。下次你的应用程序使用Brush.Black时,你会遇到问题,因为它已被处理

现在,如果您只使用Brush.Black,那么不处理它可能没问题,因为您只留下一个非托管资源(希望如此!)


但是,一般来说,您应该避免使用大量的静态IDisposables,还是我遗漏了什么?

通常只使用它们,让框架类担心如何处理它们

它们就在那里,这样您就可以使用它们,而无需每次都创建和处理它们。每一个都是在您第一次使用它时创建的,并缓存在哈希表中。框架类负责在应用程序关闭时正确处理它们

实际上,没有那么多静态IDisposables是您需要担心的。如果你会使用大量的画笔,你可能会在循环中用颜色创建它们(当然你会负责处理它们)

例如:

using (Brushes.Black)
{
...
}
使用(刷子.黑色){…}

这不是一个好主意,因为它是 静止的下次你的应用程序转到 用刷子。黑色的,你会有 问题,因为它已经 处置

它不仅仅是一个静态字段——该属性主动运行代码,以便在需要时创建新实例。只需查看相应的代码(反射器):


实际上,我在使用(brush.Black){…}时遇到了问题,因为它处于一个紧密的循环中-也许它没有立即设置为null?+1一次性对象应该由其所有者处理。来自reflector的这段代码表明调用方是所有者。@wcoenen-当您谈论自己的对象本地实例时,我同意。但是,由于这是静态的,因此您必须能够保证,在您的应用程序中的任何地方,在将来的任何时候,都不需要使用任何代码,然后才能安全地进行处理。现在,根据Reflector,在这种情况下这不应该是一个问题,因为如果画笔为空,它将生成一个新的画笔。但是,正如我在对此答案的第一条注释中所提到的,它似乎并不总是有效的,至少如果您只是使用“using”语句,并且没有显式地将其设置为null。@mbeckish:处理对象将永远不会将引用设置为null,因此Brush类不会知道它必须重新创建对象@不,调用方不是所有者,笔刷类是所有者。它保留了对对象的引用。我很惊讶你没有得到任何评论。通常,人们对总是处理可识别的对象有强烈的感觉。但是,我想在静态IDisPobles的情况下,quideline应该是“不要处理它们,也不要使用很多。”您应该处理您自己拥有的对象,但是由于Brush类拥有Brush实例,您不能处理它们。这样做会使笔刷类包含对不可用对象的引用。