[英]Static disposable objects
我该如何使用一次性物品管理static
类? 有没有经验法则?
基本上,我应该重构并使以下DisposableDataManager
类non- static
或将所有内容留给GC
吗?
。
public static class DisposableDataManager
{
// ImageList is an 'IDisposable'.
public static ImageList FirstImageList { get; private set; }
public static ImageList SecondImageList { get; private set; }
static DisposableDataManager()
{
FirstImageList = CreateFirstImageList();
SecondImageList = CreateSecondImageList();
}
// ...
}
这实际上取决于资源处置对您的重要性。 当您的应用程序关闭时,它打开的所有句柄(文件,网络连接,图形等)都将被释放,所以这不是问题。 如果你想要一个更有序的发布处理,那就更成问题了 - 例如在关闭它之前冲洗流。 在进程退出之前,CLR会尽最大努力运行终结器,在某些情况下会调用Dispose
- 但这并不是我想要依赖的重要事项。
因此,对于ImageList
对象,它确实应该不是问题。 你绝对不会泄漏任何资源 - 操作系统将负责这一点。
话虽如此,我仍然试图重构 - 仅仅因为全球状态往往是一个坏主意。 它使隐含的依赖性和测试更加困难。 在施工时向每个需要它的物体提供相关信息有多难?
(注意:静态变量实际上与AppDomain
相关联,而不是整个过程。这使得整个问题在AppDomain
启动和关闭的应用程序中更加复杂,但我怀疑它与您的场景相关。)
作为静态类,您说应用程序可以使用所有内容。 那你为什么要把它丢弃呢?
您可以挂钩AppDomain.DomainUnload事件,并在退出之前调用要确保清除的任何内容上的dispose。
我从该代码中看到的是,您将无法处置ImageList
因为DisposableDataManager
是一个静态类,在应用程序关闭之前可以访问。
我相信你目前的工作方式可能有用,但肯定有更好的方法来解决你的计划打算做什么。 如果它确实有效,那就是滥用语言 - 使用功能来反对它们的目的。
如果继续使用此体系结构路径,则代码将难以理解和修改。
用这种方法写出你所追求的内容并提出其他想法可能是值得的。
无论如何,永远不应该在静态类中保存一次性资源。 因为如果程序结束它们不太可能被处理(例如程序崩溃的情况)。 因此,您可以在一个对象中自行添加和释放资源,只要您的应用程序运行,该对象就会存在
或者您可以将ImageList更改为根本不可丢弃。 只有当您可以自行处理它拥有的所有资源时,这才是一个选项。
我认为你不需要做任何一次性对象管理器。 GC已经为您管理内存。 您可能已经知道,Dispose方法是来自IDisposable接口的一个包含在.Net框架中的方法。 但这是一种像其他人一样的方法*。 垃圾收集器不等待调用Dispose来释放对象的内存。 他监视对象是否总是可以从某个地方到达。 这有助于他确定哪些物体存活,哪些物体死亡。
之前继续阅读有关GC生成的内容。 http://msdn.microsoft.com/en-us/library/ms973837.aspx
我不确定,但是当调用new()并且GC达到实际使用的代的容量时,他清除下一代“死”对象。 可能在其他时候,我没有。 GC是一个神秘而神秘的实现,因为它可能在C ++中死记硬背。 但你不必关心它。
在某些情况下(单声道开发),我听说你应该更关心它。 但如果您在Microsoft环境中进行编码则不行。
*我告诉:
像任何其他人一样的方法
但是使用块让你可以自由地调用IDisposable对象的Dispose方法并为你调用方法。 Dispose方法的现有方法是释放在停止使用对象之前需要释放的资源。
例如:
public class Test : IDisposable
{
public void Dispose()
{
// release other necessary ressources if needed
Console.WriteLine("Disposed");
}
}
{
using (IDisposable disposable = new Test())
{
}
}
如同:
{
IDisposable disposable = new Test()
disposable.Dispose();
}
所以你可以对GC充满信心。 如果你想确保GC将释放你的对象内存,只需将它的所有引用都置为null。 GC会将您的对象视为“死亡”:P
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.