2008-11-27 94 views

回答

23

静态类被自动封闭,所以人们不能继承和重载他们的行为。

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

所以如果你使用一个静态类,你救自己制作的构造私人,并宣布密封类的麻烦。

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

+2

在IL中确实有一些特殊的东西。静态类标记为抽象和密封(这不能从C#完成),这绝对阻止了实例化。 – 2008-11-27 09:59:08

+3

请注意,根据Mehrdad([here](http://stackoverflow.com/questions/5241899/what-is-the-difference-between-static-methods-in-a-non-static-class-and-static -me/5241927#5241927)),另一个区别是非静态类的静态方法不能作为扩展方法。 – Benjol 2011-06-01 06:20:20

17

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

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

如果你永远不想实例化,我会去静态类。


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

现在你有一个Frankenstei n级。它的一些功能需要实例化,有些则不需要。也许这就是你想要的,但也许不是。您可以通过代码审查来防止这种情况,但为什么不在代码中明确表达意图?将课程标记为static可消除任何可能的混淆。您不能实例化静态类或从中继承。

15

除了以前的答案:编译器将不允许在静态类非静态成员,并产生和错误。这可能会有助于不偶然地添加非静态成员。

1

我也要去与私有构造函数永远不会被静态方法调用。所以在那里的任何初始化都会浪费......但这只是一个理论。

3

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