ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# static(C# 参考) 使用 **static** 修饰符声明属于类型本身而不是属于特定对象的静态成员。 **static** 修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类以外的类型。有关更多信息,请参见 [静态类和静态类成员(C# 编程指南)](https://msdn.microsoft.com/zh-cn/library/79b3xss3.aspx)。 下面的类声明为 **static**,并且只包含 **static** 方法: ``` static class CompanyEmployee { public static void DoSomething() { /*...*/ } public static void DoSomethingElse() { /*...*/ } } ``` 常数或者类型声明隐式地是静态成员。 不能通过实例引用静态成员。然而,可以通过类型名称引用它。例如,请考虑以下类: ``` public class MyBaseC { public struct MyStruct { public static int x = 100; } } ``` 若要引用静态成员 x,请使用完全限定名 MyBaseC.MyStruct.x,除非可从相同范围访问成员: ``` Console.WriteLine(MyBaseC.MyStruct.x); ``` 尽管类的实例包含该类所有实例字段的单独副本,但每个静态字段只有一个副本。 不可以使用 [this](https://msdn.microsoft.com/zh-cn/library/dk1507sz.aspx) 来引用静态方法或属性访问器。 如果对类应用 **static** 关键字,则该类的所有成员都必须是静态的。 类和静态类可以有静态构造函数。静态构造函数在程序开始和类实例化之间的某个时刻调用。 | ![](https://box.kancloud.cn/2016-01-31_56adb62c1380a.jpg) 注意 | | :-- | | **static** 关键字在使用上比在 C++ 中有更多限制。若要与 C++ 关键字比较,请参见 [Static (C++)](https://msdn.microsoft.com/zh-cn/library/s1sb61xd.aspx)。 | 为了说明静态成员,请看一个表示公司雇员的类。假设该类包含一种对雇员计数的方法和一个存储雇员数的字段。该方法和字段都不属于任何实例雇员,而是属于公司类。因此,应该将它们声明为此类的静态成员。 此示例读取新雇员的姓名和 ID,将雇员计数器加一,并显示新雇员的信息和新的雇员数。为简单起见,该程序从键盘读取当前的雇员数。在实际的应用中,应从文件读取此信息。 ``` public class Employee4 { public string id; public string name; public Employee4() { } public Employee4(string name, string id) { this.name = name; this.id = id; } public static int employeeCounter; public static int AddEmployee() { return ++employeeCounter; } } class MainClass : Employee4 { static void Main() { Console.Write("Enter the employee's name: "); string name = Console.ReadLine(); Console.Write("Enter the employee's ID: "); string id = Console.ReadLine(); // Create and configure the employee object: Employee4 e = new Employee4(name, id); Console.Write("Enter the current number of employees: "); string n = Console.ReadLine(); Employee4.employeeCounter = Int32.Parse(n); Employee4.AddEmployee(); // Display the new information: Console.WriteLine("Name: {0}", e.name); Console.WriteLine("ID: {0}", e.id); Console.WriteLine("New Number of Employees: {0}", Employee4.employeeCounter); } } /* Input: Matthias Berndt AF643G 15 * Sample Output: Enter the employee's name: Matthias Berndt Enter the employee's ID: AF643G Enter the current number of employees: 15 Name: Matthias Berndt ID: AF643G New Number of Employees: 16 */ ``` 此示例说明:虽然可以用另一个尚未声明的静态字段实例化一个静态字段,但直到向后者显式赋值后,才能确定结果。 ``` class Test { static int x = y; static int y = 5; static void Main() { Console.WriteLine(Test.x); Console.WriteLine(Test.y); Test.x = 99; Console.WriteLine(Test.x); } } /* Output: 0 5 99 */ ``` ## C# 语言规范 有关详细信息,请参阅 [C# 语言规范](https://msdn.microsoft.com/zh-cn/library/ms228593.aspx)。该语言规范是 C# 语法和用法的权威资料。 ## 请参阅 [C# 参考](https://msdn.microsoft.com/zh-cn/library/618ayhy6.aspx) [C# 编程指南](https://msdn.microsoft.com/zh-cn/library/67ef8sbd.aspx) [C# 关键字](https://msdn.microsoft.com/zh-cn/library/x53a06bb.aspx) [修饰符(C# 参考)](https://msdn.microsoft.com/zh-cn/library/6tcf2h8w.aspx) [静态类和静态类成员(C# 编程指南)](https://msdn.microsoft.com/zh-cn/library/79b3xss3.aspx)