【发布时间】:2010-09-24 07:03:40
【问题描述】:
当我创建实用程序类时,我通常会创建一个具有私有构造函数并将其所有方法和属性公开为静态的类。最好的方法是什么?我做的方式和创建静态类有什么区别?
【问题讨论】:
当我创建实用程序类时,我通常会创建一个具有私有构造函数并将其所有方法和属性公开为静态的类。最好的方法是什么?我做的方式和创建静态类有什么区别?
【问题讨论】:
静态类是自动密封的,所以人们不能继承和覆盖他们的行为。
这是唯一真正的区别(除非 IL 中有什么特别之处)
因此,如果您使用静态类,您就可以省去将构造函数设为私有以及将类声明为密封的麻烦。
我要补充一点,将类定义为静态是“自记录”代码。你的库的用户会知道这个类不应该被实例化,并且只有静态值。
【讨论】:
永远不能实例化静态类。没办法,没办法。
具有私有构造函数的非静态类,但所有静态方法都可以以各种方式滥用 - 继承、反射、在静态工厂中调用私有构造函数 - 以实例化该类。
如果你不想实例化,我会选择静态类。
编辑 - 澄清 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 可以消除任何可能的混淆。您不能实例化静态类或从它继承。
【讨论】:
除了前面的答案:编译器不允许静态类上的非静态成员,并产生和错误。这可能有助于避免意外添加非静态成员。
【讨论】:
您可以将具有私有构造函数的类的对象作为参数传递给任何方法,但您不能对静态类执行相同操作。这是主要区别。
【讨论】:
另外,我将使用从不被静态方法调用的私有构造函数。所以那里的任何初始化都会被浪费......但这只是一个理论。
【讨论】: