繁体   English   中英

静态类和私有构造函数

[英]Static Class and Private Constructor

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

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

此语句是否表示具有私有构造函数的类,并且下面的一个或多个静态方法是静态类? 我知道只有在类中提到static关键字时才调用类静态。

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

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() { } 
}

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

这句话试图找到正确的想法,但没有这样做。 静态类是喜欢,只有静态成员和私有构造函数的类。 这是一个包含静态成员和私有构造函数的类:

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

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

更准确的说法是:

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

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

我注意到你宣布一个既抽象又自己密封的课程是不合法的; 在C#中这样做的唯一方法是创建一个静态类。

我将把这个误导性的句子提请MSDN文档管理员注意。 谢谢你指出来。

这意味着:

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

与...基本相同

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

因为如果类只有一个私有构造函数,则无法在类外部实例化它。

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

答案是否定的,在您从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; }
    }
}

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

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

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

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

你在哪里得到的声明:

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

它试图说的是你不能创建一个静态类的实例。

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

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

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

new MyStaticClass();

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

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

另一个困惑是静态构造函数是私有还是公共? 这有助于解释行为,因为像每个类中的默认公共构造函数一样,每个静态类都有一个默认构造函数。 对我来说暗示静态构造函数是公开的,但事实并非如此。 它无法访问或调用,可以覆盖。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM