静态一次性物体

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而不是整个过程相关联.这使得整个问题在AppDomains上升和下降的应用程序中更加复杂,但我怀疑它与您的场景相关.)


Ric*_*der 5

作为静态类,您是说应用程序可以使用所有内容。那么你为什么要处理它呢?