我无法理解这一点。我尝试在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() { }
}
答案 0 :(得分:13)
因此,创建静态类与创建仅包含静态成员和私有构造函数的类非常相似
这句话试图找到正确的想法,但没有这样做。静态类不就像只有静态成员和私有构造函数的类一样。这是一个包含静态成员和私有构造函数的类:
class X
{
private X() {}
public static X Y() { return new X(); }
}
但这根本不像一个静态类!该声明的作者似乎认为拥有私有构造函数会阻止您创建实例,但当然不会。
更准确的陈述是:
创建静态类很像创建一个既抽象又密封的类,并且不包含实例成员。
事实上,当C#编译器生成静态类的代码时,它正是它所做的:它将类标记为抽象(因此无法直接实例化)和密封(因此无法扩展) 。
我注意到,宣布一个既抽象又密封自己的课程是不合法的;在C#中这样做的唯一方法是创建一个静态类。
我会将这个误导性的句子提请MSDN文档管理员注意。谢谢你指出来。
答案 1 :(得分:12)
这意味着:
public static class Foo
{
public static void Bar() { }
}
与
基本相同public class Foo
{
private Foo() { }
public static void Bar() { }
}
因为如果类只有私有构造函数,则无法在类外部实例化。
答案 2 :(得分: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; }
}
}
另一方面,静态类可能永远不会被实例化。
答案 3 :(得分:1)
您不能继承,因为没有公共构造函数,只存在私有构造函数。出于同样的原因,您无法创建实例。
在这个问题的范围内,它们可以被视为相同。你能称它为静态类吗?我认为你没有,因为它没有在类定义中标记为static
。但从功能的角度来看,您可以将其称为static
。
答案 4 :(得分:0)
使用您的示例,可以调用New()
方法的唯一方法是添加另一个方法来返回Base
实例,因为Base
无法由另一个类实例化。没有那个额外的方法使它在功能上与静态类相同。
答案 5 :(得分:0)
你在哪里得到声明:
因此,创建静态类与创建类非常相似 它只包含静态成员和私有构造函数
它试图说的是你不能创建一个静态类的实例。
创建静态类的方法是使用 static 关键字。班上的所有成员也必须是静态的。
public static class MyStaticClass
{
static MyStaticClass() { /* Constructor. Optional. */ }
public static void MyMethod() { ... }
public static int MyProperty{ get; set; }
}
再次注意,您无法创建此类的实例。以下调用将无法编译:
new MyStaticClass();
答案 6 :(得分:0)
静态类永远不能实例化,参与继承或使用接口。但是,即使具有私有构造函数的类仍可以继承,而静态类则不能继承。具有私有构造函数的类仍可以实例化其自身的实例。静态不能做到这一点。所以不,他们不一样。
我不明白为什么Microsoft有时还是不了解它的创建内容,因为它们是编写该描述的人(如Eric Lippert所述)?
另一个困惑是静态构造函数是私有的还是公共的?这将有助于解释行为,因为像每个类中的默认公共构造函数一样,每个静态类也都有一个默认构造函数。对我来说,这意味着静态构造函数将是公共的,但不是。它不能被访问或调用,并且可以被覆盖。
因为静态类在编译成密封的抽象类时会被翻译,这表明其静态构造函数实际上只是另一个默认的公共类构造函数,而没有只能被调用一次的参数。我可能是错的。但是,如果是这样的话,整个私有构造函数的解释都是没有意义的。