“Static”类是什么?

47
在C#中,以下两者有什么不同:
public static class ClassName {}

并且:

public class ClassName {}
11个回答

74

首先,对于一个回答中提到的"static"是什么的评论。在C#中,“static”表示“与类型本身有关,而不是类型的实例”。您可以使用类型名称而不是引用或值来访问静态成员(从另一个类型)。例如:

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

静态类通常用作“实用程序”类。 典型示例可能是System.Math。 创建 Math 的实例没有意义 - 它就是 "存在 "的。以下是一些规则(包括"可以"和"不可"):

  • 静态类始终派生自 object。 您不能指定不同的基类型,也不能使静态类实现接口。
  • 静态类不能具有任何实例成员 - 所有变量、方法等都必须是静态的。
  • 静态类不能声明任何实例构造函数,编译器默认情况下不会创建无参数构造函数。(在 C# 2.0 中引入静态类之前,人们经常创建一个带有私有构造函数的抽象类,以防止实例化。这里不需要。)
  • 静态类隐式地是抽象的(即它们被编译为描述抽象类的 IL),但您不能自己添加 abstract 修饰符。
  • 静态类隐式地是 sealed 的(即它们被编译为描述封闭类的 IL),但您不能自己添加 sealed 修饰符。
  • 静态类可以是泛型的。
  • 静态类可以嵌套在非静态或静态类中。
  • 静态类可以有嵌套类型,无论是非静态还是静态。
  • 仅限于静态、顶级非泛型类可以包含扩展方法(C# 3.0)。

1
@Andy:通常情况下,如果有人说“构造函数”,他们隐含地指的是“实例构造函数”。我会进行编辑,但我真的不认为这很令人困惑。 - Jon Skeet
@AbiRuban:在提问之前,你有尝试搜索网站吗?如果你已经找到了答案,这里就不需要评论。如果你没有找到答案,应该提出一个新的问题,而不是评论。我相当确定网站上还有其他类似的问题... - Jon Skeet
@JonSkeet,我在Google和stackoverflow(https://dev59.com/-GTWa4cB1Zd3GeqPASeU)中搜索了,但是我找不到正确的答案。我需要深入的回答,所以才向您提问。我已经发布了一个问题,但是stackoverflow成员关闭了我的问题。 - Niventh
1
@AbiRuban:还有许多其他问题,例如 https://dev59.com/53VC5IYBdhLWcg3wnCWA 和 https://dev59.com/IVPTa4cB1Zd3GeqPiVqq - Jon Skeet
@JonSkeet 如果我问错了什么,我很抱歉。我是软件开发的新手。 - Niventh
显示剩余8条评论

50

一个静态类无法被实例化,只能包含静态成员。因此,对于静态类的调用方式为:MyStaticClass.MyMethod(...)MyStaticClass.MyConstant

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

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

8
编译器在内部将该类标记为抽象和密封,并在IL代码中创建一个私有构造函数。 - Cecil Has a Name
你所说的 "members" 是指类内可以被声明/实例化的所有东西(例如嵌套类、字段、属性、构造函数、方法)吗?它们全部都必须声明为静态的吗? - Minh Tran
@Minh Tran:未实例化,但已声明:是的,除了析构函数和索引器 - 它们不能是静态的。对于构造函数,您只能拥有一个静态构造函数,无需参数。嵌套类默认为类的静态成员。 - lmsasu

7
public static class ClassName {}

静态类就像全局变量一样:您可以在代码的任何地方使用它们,而无需实例化。

例如:ClassName. 在点运算符之后,您可以使用它的任何属性或函数。

 public class ClassName {}

但如果您有非静态类,则需要创建此类的实例。

例如:

 ClassName classNameObject = new ClassName(); 

6

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


6
一个静态类不能被继承,而一个拥有静态成员的非静态类可以被继承。

4

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

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


静态成员和非静态成员有什么区别?也许这就是我所缺少的。 - Jeremy H

3

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

例如:System.Math


2

这篇文章是关于Java的,但我认为C#也应该有相同的概念。它非常好地解释了静态变量和静态方法的概念。


2

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

当没有依赖于其自身对象标识时,可以声明静态类,因此静态类必须仅包含静态成员。

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

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


1

C语言中的静态变量

与自动变量一样,静态变量是类的局部变量 但静态变量并不会在函数不再活跃时消失。它们的值会持续存在。如果控制权回来,则静态变量具有相同的值。

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

*C++中的静态数据成员* 数据成员可以是变量或函数 静态适用于数据成员和类本身 "静态数据成员只有一个实例被所有该类对象共享" 静态数据成员只能访问静态数据成员

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接