当我创建实用程序类时,我通常会创建一个具有私有构造函数的类,并将其所有方法和属性公开为static.对此最好的方法是什么?我的方式或创建静态类有什么区别?
静态类是自动密封的,因此人们无法继承和覆盖它们的行为.
这是唯一真正的区别(除非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
消除任何可能的混淆.您无法实例化静态类或从中继承.
除了之前的答案:编译器不允许静态类上的非静态成员产生和错误.这可能有助于一点点不会意外添加非静态成员.