静态类别具有私有构造函数的类以及所有静态属性和方法?

时间:2008-11-27 05:46:36

标签: c# .net

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

5 个答案:

答案 0 :(得分:25)

静态类会自动封闭,因此人们无法继承并覆盖其行为。

这是唯一真正的区别(除非IL中有特别的东西)

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

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

答案 1 :(得分:19)

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

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

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


编辑 - 对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可消除任何可能的混淆。您无法实例化静态类或从中继承。

答案 2 :(得分:15)

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

答案 3 :(得分:3)

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

答案 4 :(得分:1)

此外,我将继续使用静态方法调用的私有构造函数。因此,任何初始化都会浪费......但这只是一种理论。