static (Справочник по C#)

На этой странице приводятся сведения о ключевом слове модификатора static. Ключевое слово static также является частью директивы using static.

Модификатор static используется для объявления статического члена, принадлежащего собственно типу, а не конкретному объекту. Модификатор static можно использовать для объявления классов static. В классах, интерфейсах и структурах вы можете добавить модификатор static к полям, методам, свойствам, операторам, событиям и конструкторам. Модификатор static запрещено использовать с индексаторами или методами завершения. Дополнительные сведения см. в статье Статические классы и члены статических классов.

Модификатор static можно добавить в локальную функцию. Статическая локальная функция не может сохранять локальные переменные или состояние экземпляра.

Начиная с C# 9.0 можно добавить модификатор 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;
    }
}

Чтобы обратиться к члену staticx, воспользуйтесь полным именем — 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#.

См. также