【问题标题】:Static Class Vs. Class with private constructor and all static properties and methods?静态类与。具有私有构造函数和所有静态属性和方法的类?
【发布时间】:2010-09-24 07:03:40
【问题描述】:

当我创建实用程序类时,我通常会创建一个具有私有构造函数并将其所有方法和属性公开为静态的类。最好的方法是什么?我做的方式和创建静态类有什么区别?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    静态类是自动密封的,所以人们不能继承和覆盖他们的行为。

    这是唯一真正的区别(除非 IL 中有什么特别之处)

    因此,如果您使用静态类,您就可以省去将构造函数设为私有以及将类声明为密封的麻烦。

    我要补充一点,将类定义为静态是“自记录”代码。你的库的用户会知道这个类不应该被实例化,并且只有静态值。

    【讨论】:

    • IL 实际上有一些特别之处。静态类被标记为抽象类和密封类(C# 无法做到这一点),这绝对阻止了实例化。
    • 请注意,根据 Mehrdad (here),另一个区别是非静态类上的静态方法不能是扩展方法。
    【解决方案2】:

    永远不能实例化静态类。没办法,没办法。

    具有私有构造函数的非静态类,但所有静态方法都可以以各种方式滥用 - 继承、反射、在静态工厂中调用私有构造函数 - 以实例化该类。

    如果你不想实例化,我会选择静态类。


    编辑 - 澄清 FosterZ 的评论

    假设你有这个实用程序类:

    public class Utility
    {
        public static string Config1 { get { return "Fourty Two"; } }
    
        public static int Negate(int x) { return -x; }
    
        private Utility() { }      
    }
    

    如果其他开发人员不清楚其意图,他们可以这样做:

    public class Utility
    {
        public static string Config1 { get { return "Fourty Two"; } }
        public int Config2 { get; set; }
    
        public static int Negate(int x) { return -x; }
    
        private Utility() { }
    
        /// Get an instance of Utility     
        public static Utility GetUtility()
        {
            return new Utility();
        }
    }   
    

    现在您有了科学怪人课程。它的某些功能需要实例化,而有些则不需要。也许这就是你想要的,但也许不是。您可以通过代码审查来防止这种情况发生,但为什么不在代码中明确表达您的意图呢?将类标记为static 可以消除任何可能的混淆。您不能实例化静态类或从它继承。

    【讨论】:

    • 能否请您给我一个小例子来说明这一点“在静态工厂中调用私有构造函数 - 实例化类”,我觉得有点难以理解......
    • @FosterZ - 我在答案中添加了一个示例。干杯。
    • “一个静态类永远不能被实例化。没办法,没办法。” - 静态类不是实例化一次,而是只实例化一次?你甚至可以创建一个静态构造函数,尽管是一个无参数的构造函数。
    【解决方案3】:

    除了前面的答案:编译器不允许静态类上的非静态成员,并产生和错误。这可能有助于避免意外添加非静态成员。

    【讨论】:

      【解决方案4】:

      您可以将具有私有构造函数的类的对象作为参数传递给任何方法,但您不能对静态类执行相同操作。这是主要区别。

      【讨论】:

        【解决方案5】:

        另外,我将使用从不被静态方法调用的私有构造函数。所以那里的任何初始化都会被浪费......但这只是一个理论。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-24
          • 2016-12-19
          • 2017-11-23
          • 1970-01-01
          • 2015-06-28
          • 1970-01-01
          相关资源
          最近更新 更多