c# - 静态一次性元素

标签 c# winforms static garbage-collection dispose

  • 我应该如何管理带有一次性元素的static 类?有什么经验法则吗?

  • 基本上,我应该重构并制作以下​​ DisposableDataManager非- 静态 还是将所有内容留给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 的应用程序中变得更加复杂上下,但我怀疑它与您的场景相关。)

关于c# - 静态一次性元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12092529/

相关文章:

c# - 按用户订购,然后选择最大日期

c# - 代码正在被取消

c# - 有没有办法强制显示工具提示?

.net - 如何在devexpress中通过代码触发按钮?

java - 巨大的字符串静态数组

c++ - 如何定义静态 boost 共享指针?

c# - 接口(interface)的可选参数

c# - 为什么 Linq 扩展方法不位于 IEnumerator 而不是 IEnumerable 上?

c# - 绑定(bind)到静态属性的一种方法失败

c# - 如何从控制台应用程序运行 winform?