关于c#:什么是“静态”类?

What is a “static” class?

在c中:

1
public static class ClassName {}

还有:

1
public class ClassName {}

首先,对一个回答的评论被问及"静态"是什么意思。在C术语中,"static"表示"与类型本身相关,而不是与类型的实例相关。"您可以使用类型名而不是引用或值访问静态成员(从其他类型)。例如:

1
2
3
4
// Static method, so called using type name
Guid someGuid = Guid.NewGuid();
// Instance method, called on a value
string asString = someGuid.ToString();

现在,静态类…

静态类通常用作"实用程序"类。典型的例子可能是System.Math。创建一个数学实例是没有意义的——它只是"是"。一些规则(包括"可以"和"不能"):

  • 静态类总是从object派生。不能指定其他基类型,也不能使静态类实现接口。
  • 静态类不能有任何实例成员-所有变量、方法等都必须是静态的。
  • 静态类不能声明任何实例构造函数,编译器默认情况下不创建无参数构造函数。(在静态类进入C 2.0之前,人们通常会用一个私有的构造函数创建一个抽象类,以防止实例化。这里不需要。
  • 静态类是隐式抽象的(即编译到描述抽象类的IL中),但不能自己添加abstract修饰符。
  • 静态类是隐式密封的(即编译到描述密封类的IL),但不能自己添加sealed修饰符。
  • 静态类可以是泛型的。
  • 静态类可以嵌套在非静态类或静态类中。
  • 静态类可以具有嵌套类型,非静态或静态。
  • 只有静态的顶级非泛型类才能包含扩展方法(C 3.0)。


静态类不能实例化,只能包含静态成员。因此,对静态类的调用如下:MyStaticClass.MyMethod(...)MyStaticClass.MyConstant

非静态类可以实例化,并且可以包含非静态成员(实例构造函数、析构函数、索引器)。非静态类的非静态成员只能通过对象调用:

1
2
MyNonStaticClass x = new MyNonStaticClass(...);
x.MyNonStaticMethod(...);


1
public static class ClassName {}

静态类就像一个全局变量:您可以在代码中的任何地方使用它,而无需实例化它们。例如:classname。在点运算符之后,可以使用它的任何属性或函数。

1
 public class ClassName {}

但是如果您有非静态类,那么您需要创建这个类的实例。例如:

1
 ClassName classNameObject = new ClassName();

静态类也不能从继承,而具有静态成员的非静态类可以从继承。


静态类中的所有方法/属性都必须是静态的,而"普通"类可以包含实例和静态方法的混合。


不能实例化(创建)静态类的对象。它只能包含静态成员。

示例:System.Math


静态类只能包含静态成员。

静态成员可以在不先实例化类的情况下使用。


http://www.javaworld.com/javaworld/javaqa/1999-08/01-qa-static2.html-这是一篇非常好的文章。这是为Java编写的。但我认为C中的概念也应该相同。


静态类和成员用于创建不需要创建类的实例(使用new关键字,它们不能有构造函数)即可访问的数据和方法。

当不依赖于静态类本身的对象标识时,可以声明静态类,因此静态类只能包含静态成员。

当加载包含类的程序或命名空间时,CLR将加载这些类。

它们也是密封的,不能从中继承。


C中的静态变量

作为自动变量的类的局部变量但静态变量不会消失,因为函数不再处于活动状态。它们的值将保持不变。如果控件返回,静态变量的值将相同

C中的静态函数对其他文件中的函数不可见的函数。

*cpp中的静态数据成员*数据成员可以是cpp中的变量或函数静态应用于两个数据成员类本身可以是静态的"该类中的所有对象只共享一个静态数据成员副本"静态数据成员只能访问静态数据成员

静态类此类无法实例化对象