什么是“静态”课程?

时间:2009-03-29 18:05:03

标签: c# static-classes

在C#中有什么区别:

public static class ClassName {}

public class ClassName {}

10 个答案:

答案 0 :(得分:67)

首先,对答案的评论询问“静态”是什么意思。在C#术语中,“静态”表示“与类型本身有关,而不是类型的实例”。您可以使用类型名称而不是引用或值来访问静态成员(来自其他类型)。例如:

// 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)。

答案 1 :(得分:39)

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

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

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

答案 2 :(得分:6)

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

答案 3 :(得分:6)

public static class ClassName {}

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

 public class ClassName {}

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

 ClassName classNameObject = new ClassName(); 

答案 4 :(得分:5)

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

答案 5 :(得分:3)

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

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

答案 6 :(得分:3)

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

示例:System.Math

答案 7 :(得分:2)

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

静态类可以在不依赖于自己的对象标识时声明,因此静态类必须只包含静态成员。

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

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

答案 8 :(得分:2)

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

答案 9 :(得分:1)

c中的静态变量

类的本地变量作为自动变量 但是静态变量不会消失,因为函数不再有效。它们的值仍然存在。如果控制返回,静态变量具有相同的值

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

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

静态课程 这个类不能实例化对象