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

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

静态类是自动密封的,因此人们不能inheritance和覆盖它们的行为。

这是唯一真正的区别(除非IL中有特殊内容)

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

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

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

具有私有构造函数但非所有静态方法的非静态类可以以各种方式滥用 – inheritance,reflection,在静态工厂中调用私有构造函数 – 来实例化类。

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


编辑 – 澄清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(); } } 

现在你有一个弗兰肯斯坦class。 它的一些function需要实例化,有些则不需要。 也许这就是你想要的,但也许不是。 您可以通过代码审查来防止这种情况,但为什么不在代码中明确表达您的意图? 将类标记为static消除任何可能的混淆。 您无法实例化静态类或从中inheritance。

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

你可以将具有私有构造函数的类的对象作为参数传递给任何方法,但是你不能对静态类做同样的事情。 这是主要的区别。

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