3

我无法理解这一点。我尝试在 VS2010 中做一个小例子,如下所示。

“因此,创建静态类与创建仅包含静态成员和私有构造函数的类非常相似”

此语句是否意味着具有私有构造函数和一个或多个如下静态方法的类是静态类?我知道只有在类中提到静态关键字时,我们才称其为静态类。

另外,我们不能继承下面的类,也不能实例化这个类,对吧?

public class Base
{
    private Base() { Console.WriteLine(" I am from normal Base constructor"); }
    static void NewMethod() { Console.WriteLine("Hey I am from Static Base"); }
    public void New() { } 
}
4

7 回答 7

13

因此,创建静态类与创建仅包含静态成员和私有构造函数的类非常相似

该声明试图传达正确的想法,但未能做到。静态类不像只有静态成员和私有构造函数的类。这是一个具有静态成员和私有构造函数的类:

class X
{
    private X() {}
    public static X Y() { return new X(); }
}

但这根本不像一个静态类!该声明的作者似乎认为拥有私有构造函数会阻止您创建实例,但它当然不会。

更准确的说法是:

创建一个静态类很像创建一个既抽象又密封的类,并且不包含实例成员。

事实上,当 C# 编译器为静态类生成代码时,它正是这样做的:它将类标记为抽象的(因此不能直接实例化)和密封的(因此不能扩展)。

我注意到你自己声明一个抽象类和密封类是不合法的;在 C# 中这样做的唯一方法是创建一个静态类。

我会提请 MSDN 文档管理员注意这个误导性的句子。感谢您指出。

于 2013-02-13T15:42:55.930 回答
12

它的意思是:

public static class Foo
{
    public static void Bar() { }
}

本质上是一样的

public class Foo
{
    private Foo() { }
    public static void Bar() { }
}

因为如果类只有私有构造函数,就不能在类外实例化。

于 2013-02-13T13:39:25.513 回答
4

“这句话是否意味着具有私有构造函数和一个或多个如下静态方法的类是静态类?”

答案是否定的,并且在您从MSDN引用的那句话之后的下一句中解释了一个区别:

使用静态类的优点是编译器可以检查以确保没有意外添加实例成员。


这意味着您将收到Class2如下所示的编译器错误。

public class Class1
{
    private Class1() { }
    public static void Method() { }
    private string member; // valid, but pointless
}

public static class Class2
{
    public static void Method() { }
    private string member; // error CS0708
}

更重要的是,虽然Class1有一个私有的构造函数,它仍然可以被实例化:

public class Class1
{
    private Class1() { }

    private static Class1 instance = new Class1();

    public static Class1 Instance
    {
        get { return instance; }
    }
}

另一方面,静态类可能永远不会被实例化。

于 2013-02-13T13:43:31.667 回答
1

您不能继承,因为没有公共构造函数,只有私有构造函数存在。出于同样的原因,您不能创建实例。

在这个问题的范围内,它们可以被看作是相同的。你能称之为静态类吗?我认为正式你没有,因为它没有static在类定义中标记。但从功能的角度来看,你可以称之为static

于 2013-02-13T13:44:39.293 回答
0

New()在您的示例中,可以调用该方法的唯一方法是添加另一个方法来返回一个Base实例,因为Base不能被另一个类实例化。没有那个额外的方法使它在功能上与静态类相同。

于 2013-02-13T13:41:08.663 回答
0

你从哪里得到的声明:

因此,创建静态类与创建仅包含静态成员和私有构造函数的类非常相似

它想说的是您不能创建静态类的实例。

创建静态类的方法是使用static关键字。类中的所有成员也必须是静态的。

public static class MyStaticClass
{
      static MyStaticClass() { /* Constructor.  Optional. */ }
      public static void MyMethod() { ... }
      public static int MyProperty{ get; set; }
}

再次注意,您不能创建此类的实例。以下调用将无法编译:

new MyStaticClass();
于 2013-02-13T13:45:43.013 回答
0

静态类永远不能被实例化、参与继承或使用接口。但是一个类,即使有一个私有构造函数,仍然可以继承,而静态类不能。具有私有构造函数的类仍然可以实例化自身的实例。静态无法做到这一点。所以不,它们不一样。

我不明白为什么微软有时仍然不明白它创造了什么,因为他们是写那个描述的人(正如 Eric Lippert 提到的)?

另一个困惑是静态构造函数是私有的还是公共的?这将有助于解释行为,因为就像每个类中的默认公共构造函数一样,每个静态类也有一个默认构造函数。对我来说,这意味着静态构造函数将是公共的,但事实并非如此。它不能被访问或调用,并且可以被覆盖。

因为静态类在编译为密封的抽象类时会被转换,这表明它的静态构造函数实际上只是另一个默认的公共类构造函数,没有参数,只能调用一次。我可能是错的。但如果是这样的话,整个私有构造函数的解释就没有意义了。

于 2018-10-22T04:57:20.890 回答