Yip*_*Yay 11 c# static garbage-collection dispose winforms
我该如何管理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();
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 14
这实际上取决于资源处置对您的重要性.当您的应用程序关闭时,它打开的所有句柄(文件,网络连接,图形等)都将被释放,所以这不是问题.如果你想要一个更有序的发布处理,那就更成问题了 - 例如在关闭它之前冲洗流.在进程退出之前,CLR会尽最大努力运行终结器,Dispose
在某些情况下会调用- 但这并不是我想要依赖的任何重要事项.
所以在ImageList
对象的情况下,它确实应该不是问题.你绝对不会泄漏任何资源 - 操作系统将负责这一点.
话虽如此,我仍然试图重构 - 仅仅因为全球状态往往是一个坏主意.它使隐含的依赖性和测试更加困难.在施工时向每个需要它的物体提供相关信息有多难?
(注意:静态变量实际上与一个AppDomain
而不是整个过程相关联.这使得整个问题在AppDomain
s上升和下降的应用程序中更加复杂,但我怀疑它与您的场景相关.)