当我创建实用程序类时,我通常会创建一个具有私有构造函数的类,并将其所有方法和属性公开为static。对此最好的方法是什么?我的方式或创建静态类之间的区别是什么?
答案 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)
此外,我将继续使用静态方法调用的私有构造函数。因此,任何初始化都会浪费......但这只是一种理论。