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

Модификатор static используется для объявления статического члена, принадлежащего собственно типу, а не конкретному объекту.Use the static modifier to declare a static member, which belongs to the type itself rather than to a specific object. Модификатор static можно использовать с классами, полями, методами, свойствами, операторами, событиями и конструкторами, но нельзя — с индексаторами, методами завершения или типами, отличными от классов.The static modifier can be used with classes, fields, methods, properties, operators, events, and constructors, but it cannot be used with indexers, finalizers, or types other than classes. Дополнительные сведения см. в статье Статические классы и члены статических классов.For more information, see Static Classes and Static Class Members.

ПримерExample

Следующий класс объявляется как static и содержит только методы static: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 cannot be referenced through an instance. а можно только через имя типа.Instead, it is referenced through the type name. Например, рассмотрим следующий класс.For example, consider the following class:

public class MyBaseC
{
    public struct MyStruct
    {
        public static int x = 100;
    }
}

Чтобы обратиться к статическому члену x, воспользуйтесь полным именем — MyBaseC.MyStruct.x (если только член не доступен из той же области действия):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 is only one copy of each static field.

Невозможно использовать this для ссылки на статические методы или методы доступа к свойствам.It is not possible to use this to reference static methods or property accessors.

Если к классу применяется ключевое слово static, все члены этого класса должны быть статическими.If the static keyword is applied to a class, all the members of the class must be static.

Классы и статические классы могут иметь статические конструкторы.Classes and static classes may have static constructors. Статические конструкторы вызываются на определенном этапе между запуском программы и созданием экземпляра класса.Static constructors are called at some point between when the program starts and the class is instantiated.

Примечание

Ключевое слово static имеет более ограниченное применение по сравнению с C++.The static keyword has more limited uses than in C++. Сведения о сравнении с ключевым словом С++ см. в статье Классы хранения (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 do not belong to any instance employee. Они принадлежат классу компании.Instead they belong to the company class. В связи с этим они должны объявляться как статические члены класса.Therefore, they should be declared as static members of the class.

ПримерExample

В этом примере выполняется чтение имени и идентификатора нового сотрудника, увеличение счетчика сотрудников на единицу, а также отображение сведений о новом сотруднике и новом числе сотрудников.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. Для простоты эта программа считывает текущее число сотрудников с клавиатуры.For simplicity, this program reads the current number of employees from the keyboard. В реальном приложении эта информация должна считываться из файла.In a real application, this information should be read from a file.

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

Этот пример показывает, что несмотря на то, что вы можете инициализировать статическое поле посредством другого, еще не объявленного статического поля, результаты не будут определены до тех пор, пока статическому полю не будет явно присвоено значение.This example shows that although you can initialize a static field by using another static field 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#C# language specification

Дополнительные сведения см. в спецификации языка C#.For more information, see the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.The language specification is the definitive source for C# syntax and usage.

См. такжеSee also