静态类有什么用?

时间:2009-02-23 08:01:14

标签: c# .net

静态类有什么用? 我的意思是使用静态类有什么好处以及CLR如何处理静态类?

9 个答案:

答案 0 :(得分:30)

静态类只表示您不期望或不需要实例。这对于实用程序逻辑很有用,其中代码不是特定于对象的。例如,扩展方法只能 写入静态类。

Pre C#2.0,你可以拥有一个私有构造函数的常规类;但是static使得永远不会拥有一个实例(有没有构造函数*,所有成员必须是静态的)是正式的)。

(* =请参阅注释链;您可以选择使用类型初始值设定项(静态构造函数aka .cctor),但您不能拥有实例构造函数(又名.ctor))。

答案 1 :(得分:5)

.net的编译和元数据模型要求所有函数都在类中定义。这使得反射api的生活变得更容易和简单,因为拥有类的概念及其可见性得到了很好的定义。它也使il模型更简单。

因为这排除了自由函数(与类没有关联的函数),所以这使得可以选择放置没有关联状态的函数的位置(因此需要一个实例)。如果他们不需要与他们相关联的状态,也没有任何明确的基于实例的类可以与之相关联并因此在其中定义,那么他们的定义需要有一些成语。

以前最好的方法是在类中定义方法,这些方法的构造函数是私有的,并且类中没有任何函数构造它。

这有点乱(因为它没有说清楚为什么没有注释就完成了)并且反射api仍然可以找到构造函数并调用它。

因此允许使用静态类,使得类的意图,静态方法定义的位置,对用户和类型系统都清楚。静态类根本没有构造函数。

答案 2 :(得分:3)

静态类是用C#编写程序程序的语言攻击。

答案 3 :(得分:2)

静态类的所有成员都必须是静态成员,因此,如果您忘记在其中任何一个之前添加'static',您的代码将无法编译,它也会使您的代码更具可读性,因为任何人都会看到class is static将理解它只包含静态成员。

静态类的最佳用途是实用程序函数,您也可以使用它们来保存应用程序中的全局方法和数据。我几乎在任何项目中都经常使用静态静态类。

答案 4 :(得分:2)

静态类通常用于对您最初不希望使用对象实例访问的相关全局服务进行分组。一个例子是你直接使用的.Net BCL中的 Math 类,例如Math.Sqrt(10.0)

答案 5 :(得分:1)

静态类是密封的。对于实用程序类,这可能是一个有用的选项。

答案 6 :(得分:1)

我从这些陈述中得到了明确的想法。

了解有关静态类的更多信息。首先,我们必须首先区分静态实例数据。

每次创建类的新实例时,都会获得要使用的实例数据的新副本。该类的实例方法适用于实例数据。实例数据完全独立于所有其他类中的实例数据,甚至是同一类的实例。如果在一个实例中更改值,则对其他实例中的相同值没有影响。大部分程序数据是实例数据。

静态数据等同于全局数据。程序中的每个人都看到相同的数据。如果有人更改了数据,那么其他人也会看到更改。静态数据对于跨程序共享信息非常有用,例如数据库连接字符串或日志文件。一般来说,内存中只有一个静态数据副本。 (例如处理多个appdomains时有例外情况。)

当您创建类的实例时,您实际上正在分配一些内存来保存您自己的类定义的实例数据副本。如果您创建了一个类的5个实例,那么您将获得5个单独的内存位置,其中每个位置都有自己的实例数据副本。每个内存块都独立于其他内存块。

如果一个类没有实例数据,那么创建它的实例就没有任何意义。这样做是无害的,但也浪费时间。这就是静态类的用武之地。静态类是一种将类标识为没有实例数据的方法通过将类标记为静态,您告诉编译器该类中的所有数据都是全面共享的。因此,编译器会强制执行一些规则以使事情变得清晰。静态类只能包含静态成员。无法实例化静态类。必须密封静态类。为方便开发人员,编译器强制执行此操作。

静态类是密封的。这是因为静态类不能包含每个实例数据。

静态方法是在类型级别上定义的,而不是在实例级别上定义的。这就是为什么覆盖不适用于静态方法/属性/事件......

静态构造函数被调用一次,静态类在程序所在的应用程序域的生命周期内保留在内存中。

答案 7 :(得分:0)

参考:http://msdn.microsoft.com/en-us/library/79b3xss3(VS.80).aspx

1.首先,你不能为静态类创建实例

  1. 如果类声明为static,则成员变量对于该类
  2. 应该是静态的

    3.Sealed [不能继承]

    4.Cannot包含实例构造函数

    5.记忆管理

    示例:数学计算(数学值)不会改变[定义值的标准计算]

答案 8 :(得分:-3)

在一个类中,我们将一个函数声明为static,只有当该函数没有与任何对象相关联时。我们不应该在那个静态函数中使用“this”运算符,因为“this”运算符将引用调用该函数的对象。例如:考虑一个名为Employee的类,其中包含很少的变量,如Name,Age,Department,在这个Employee类中,我将添加一个名为getSimilarNames()的函数,该函数将显示有多少具有相似名称的员工。此功能无需与任何员工关联。所以我将此函数声明为Static.If是一个只包含静态函数的类,我们声明该类是一个静态类。静态功能可提高性能。