static (Справочник по C#)
На этой странице приводятся сведения о ключевом слове модификатора static
. Ключевое слово static
также является частью директивы using static
.
Модификатор static
используется для объявления статического члена, принадлежащего собственно типу, а не конкретному объекту. Модификатор static
можно использовать для объявления классов static
. В классах, интерфейсах и структурах вы можете добавить модификатор static
к полям, методам, свойствам, операторам, событиям и конструкторам. Модификатор static
запрещено использовать с индексаторами или методами завершения. Дополнительные сведения см. в статье Статические классы и члены статических классов.
Модификатор static
можно добавить в локальную функцию. Статическая локальная функция не может сохранять локальные переменные или состояние экземпляра.
Модификатор можно добавить в static
лямбда-выражение или анонимный метод. Статическое лямбда-выражение или анонимный метод не могут сохранять локальные переменные или состояние экземпляра.
Пример: статический класс
Следующий класс объявляется как static
и содержит только методы static
:
static class CompanyEmployee
{
public static void DoSomething() { /*...*/ }
public static void DoSomethingElse() { /*...*/ }
}
Объявление константы или типа неявно является членом static
. На член static
невозможно ссылаться через экземпляр, а можно только через имя типа. Например, рассмотрим следующий класс.
public class MyBaseC
{
public struct MyStruct
{
public static int x = 100;
}
}
Чтобы обратиться к члену static
x
, воспользуйтесь полным именем — MyBaseC.MyStruct.x
(если только член не доступен из той же области действия).
Console.WriteLine(MyBaseC.MyStruct.x);
Так как экземпляр класса содержит отдельную копию всех полей экземпляра класса, каждому полю static
соответствует только одна копия.
Невозможно использовать this
для ссылки на методы static
или методы доступа к свойствам.
Если к классу применяется ключевое слово static
, все члены этого класса должны быть static
.
Классы, интерфейсы и классы static
могут иметь конструкторы static
. Конструктор static
вызывается на определенном этапе между запуском программы и созданием экземпляра класса.
Примечание.
Ключевое слово static
имеет более ограниченное применение по сравнению с C++. Сведения о сравнении с ключевым словом С++ см. в статье Классы хранения (C++).
В качестве демонстрации членов static
рассмотрим класс, представляющий сотрудника компании. Предположим, что этот класс содержит метод для подсчета сотрудников и поле для хранения их числа. И метод, и поле не принадлежат никакому экземпляру сотрудника. Они принадлежат всему классу сотрудников. В связи с этим они должны объявляться как члены static
класса.
Пример: статическое поле и метод
В этом примере выполняется чтение имени и идентификатора нового сотрудника, увеличение счетчика сотрудников на единицу, а также отображение сведений о новом сотруднике и новом числе сотрудников. Эта программа считывает текущее число сотрудников с клавиатуры.
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
*/
Пример: статическая инициализация
В этом примере показано, как можно инициализировать поле static
, используя другое поле static
, которое еще не объявлено. Результаты будут неопределенными до тех пор, пока вы явно не присвоите значение полю static
.
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#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.