static (C# Reference)
This page covers the static
modifier keyword. The static
keyword is also part of the using static
directive.
Use the static
modifier to declare a static member, which belongs to the type itself rather than to a specific object. The static
modifier can be used to declare static
classes. In classes, interfaces, and structs, you may add the static
modifier to fields, methods, properties, operators, events, and constructors. The static
modifier can't be used with indexers or finalizers. For more information, see Static Classes and Static Class Members.
You can add the static
modifier to a local function. A static local function can't capture local variables or instance state.
You can add the static
modifier to a lambda expression or anonymous method. A static lambda or anonymous method can't capture local variables or instance state.
Example - static class
The following class is declared as static
and contains only static
methods:
static class CompanyEmployee
{
public static void DoSomething() { /*...*/ }
public static void DoSomethingElse() { /*...*/ }
}
A constant or type declaration is implicitly a static
member. A static
member can't be referenced through an instance. Instead, it's referenced through the type name. For example, consider the following class:
public class MyBaseC
{
public struct MyStruct
{
public static int x = 100;
}
}
To refer to the static
member x
, use the fully qualified name, MyBaseC.MyStruct.x
, unless the member is accessible from the same scope:
Console.WriteLine(MyBaseC.MyStruct.x);
While an instance of a class contains a separate copy of all instance fields of the class, there's only one copy of each static
field.
It isn't possible to use this
to reference static
methods or property accessors.
If the static
keyword is applied to a class, all the members of the class must be static
.
Classes, interfaces, and static
classes may have static
constructors. A static
constructor is called at some point between when the program starts and the class is instantiated.
Note
The static
keyword has more limited uses than in C++. To compare with the C++ keyword, see Storage classes (C++).
To demonstrate static
members, consider a class that represents a company employee. Assume that the class contains a method to count employees and a field to store the number of employees. Both the method and the field don't belong to any one employee instance. Instead, they belong to the class of employees as a whole. They should be declared as static
members of the class.
Example - static field and method
This example reads the name and ID of a new employee, increments the employee counter by one, and displays the information for the new employee and the new number of employees. This program reads the current number of employees from the keyboard.
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: {e.name}");
Console.WriteLine($"ID: {e.id}");
Console.WriteLine($"New Number of Employees: {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
*/
Example - static initialization
This example shows that you can initialize a static
field by using another static
field that is not yet declared. The results will be undefined until you explicitly assign a value to the static
field.
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# language specification
For more information, see the C# Language Specification. The language specification is the definitive source for C# syntax and usage.