static(C# 参考)
使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员。static 修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类以外的类型。例如,下面的类声明为 static,并且只包含 static 方法。
static class CompanyEmployee
{
public static string GetCompanyName(string name) { ... }
public static string GetCompanyAddress(string address) { ... }
}
有关更多信息,请参见静态类和静态类成员(C# 编程指南)。
备注
常数或者类型声明隐式地是静态成员。
不能通过实例引用静态成员。然而,可以通过类型名称引用它。例如,请考虑以下类:
public class MyBaseC { public struct MyStruct { public static int x = 100; } }
若要引用静态成员
x
,请使用完全限定名(除非可从相同范围访问):MyBaseC.MyStruct.x
尽管类的实例包含该类所有实例字段的单独副本,但每个静态字段只有一个副本。
不可以使用 this 来引用静态方法或属性访问器。
如果对类应用 static 关键字,则该类的所有成员都必须是静态的。
类(包括静态类)可以有静态构造函数。在程序开始和实例化类之间的某个时刻调用静态构造函数。
备注
static 关键字在使用上比在 C++ 中有更多的限制。若要与 C++ 关键字比较,请参见 static。
为了说明静态成员,请看一个表示公司雇员的类。假设该类包含一种对雇员计数的方法和一个存储雇员数的字段。该方法和字段都不属于任何实例雇员,而是属于公司类。因此,应该将它们声明为此类的静态成员。
示例
该示例读取新雇员的名称和 ID,逐个增加雇员计数器并显示新雇员的有关信息以及新的雇员数。为简单起见,该程序从键盘读取当前的雇员数。在实际的应用中,应从文件读取此信息。
// cs_static_keyword.cs
using System;
public class Employee
{
public string id;
public string name;
public Employee()
{
}
public Employee(string name, string id)
{
this.name = name;
this.id = id;
}
public static int employeeCounter;
public static int AddEmployee()
{
return ++employeeCounter;
}
}
class MainClass : Employee
{
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:
Employee e = new Employee(name, id);
Console.Write("Enter the current number of employees: ");
string n = Console.ReadLine();
Employee.employeeCounter = Int32.Parse(n);
Employee.AddEmployee();
// Display the new information:
Console.WriteLine("Name: {0}", e.name);
Console.WriteLine("ID: {0}", e.id);
Console.WriteLine("New Number of Employees: {0}",
Employee.employeeCounter);
}
}
输入
Tara Strahan AF643G 15
示例输出
Enter the employee's name: Tara Strahan Enter the employee's ID: AF643G Enter the current number of employees: 15 Name: Tara Strahan ID: AF643G New Number of Employees: 16
此示例显示:虽然可以用另一个尚未声明的静态字段实例化一个静态字段,但只要给静态字段显式赋值后,结果才是确定的。
// cs_static_keyword_2.cs
using System;
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);
}
}
输出
0 5 99
C# 语言规范
有关更多信息,请参见 C# 语言规范中的以下各章节:
1.6.5.3 静态方法和实例方法
5.1.1 静态变量
10.2.5 静态成员和实例成员
10.4.1 静态字段和实例字段
10.4.5.1 静态字段初始化
10.5.2 静态方法和实例方法
10.6.1 静态属性和实例属性
10.7.3 静态事件和实例事件
10.11 静态构造函数
请参见
参考
C# 关键字
修饰符(C# 参考)
静态类和静态类成员(C# 编程指南)