代码之家  ›  专栏  ›  技术社区  ›  Jon Seigel

为什么静态类不能有析构函数?

  •  13
  • Jon Seigel  · 技术社区  · 16 年前

    本报告由两部分组成:

    4 回复  |  直到 11 年前
        1
  •  19
  •   Konamiman    16 年前

    不应该使用静态类,而应该使用具有singleton模式的普通类(即,保留类的一个实例,可能由类本身的一个静态属性引用)。然后你可以有一个析构函数,或者更好,析构函数和 Dispose

    例如,如果您现在有:

    static class MyClass
    {
        public static void MyMethod() {...}
    }
    
    //Using the class:
    MyClass.MyMethod();
    

    相反,你应该:

    class MyClass : IDisposable
    {
        public static MyClass()
        {
            Instance=new MyClass();
        }
    
        public static MyClass Instance {get; private set;}
    
        public void MyMethod() {...}
    
        public void Dispose()
        {
            //...
        }
    
        ~MyClass()
        {
            //Your destructor goes here
        }
    }
    
    //Using the class:
    MyClass.Instance.MyMethod();
    

        2
  •  7
  •   Mark Byers    16 年前
    1. 静态类没有析构函数,因为静态类永远不会被销毁。

    2. 如果您想创建和销毁它的多个实例,它不应该是静态的。让它成为一个完整的类。

    3. 无论如何,析构函数都不应该用于此目的。使用IDisposable/Dispose。

        3
  •  3
  •   John K    16 年前

    类型本身不能像您通常认为的实例上的构造函数那样具有构造函数。一般来说,它有时被称为“静态初始值设定项”方法,但Microsoft使用术语“类型构造函数”(它有特殊的限制)-您将代码放入其中以初始化类型/类-如果它是实例构造函数,则可能会重载。对“类型构造函数”的这种静态限制是因为.NET CLR负责在堆上加载类模板,并且在这种情况下不允许指定参数(因为您将如何传递参数)。因为从最严格的意义上讲,程序员不负责导致调用类型构造函数,所以当静态析构函数更多地位于CLR的域中时,允许程序员编写静态析构函数是没有多大意义的。CLR最终将从堆中删除类模板,但该类模板的生存期长于其实例,因此您无论如何都不希望在其中执行任何资源密集型操作(例如,保持打开db连接)。

    2.什么独生子女 如果您遇到一种情况,您觉得需要在类模板上打开资源并在以后销毁它,您可能会考虑 Singleton software pattern System.IDiposable 除析构函数外,还有一个用于帮助清理的接口。(我看到有人已经在IDisposable代码示例中击败了我,所以我将在这里结束我的解决方案。)

        4
  •  1
  •   Rune FS    16 年前

    推荐文章