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

Обновлен: Ноябрь 2007

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

Пример

Следующий класс объявляется как static и содержит только static методы.

static class CompanyEmployee
{
    public static void DoSomething() { /*...*/ }
    public static void DoSomethingElse() { /*...*/  }
}

Объявление константы или типа неявно является статическим членом.

На статический член нельзя ссылаться через экземпляр. а можно только через имя типа. Например, рассмотрим следующий класс.

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

Чтобы создать ссылку на статический член x, воспользуйтесь полным именем (если только оно не доступно из той же области действия).

MyBaseC.MyStruct.x

Поскольку экземпляр класса содержит отдельную копию всех полей экземпляра класса, каждому статическому полю соответствует только одна копия.

Так нельзя ссылаться на статические методы или методы доступа к свойствам.

Если к классу применяется ключевое слово static, все члены этого класса должны быть статическими.

Классы и статические классы могут иметь статические конструкторы. Статические конструкторы вызываются на определенном этапе между запуском программы и созданием экземпляра класса.

98f28cdx.alert_note(ru-ru,VS.90).gifПримечание.

Ключевое слово static имеет более ограниченное применение по сравнению с C++. Сведения о сравнении с ключевым словом С++ см. в разделе Static (C++).

В качестве демонстрации статических членов рассмотрим класс, представляющий сотрудника компании. Предположим, что этот класс содержит метод для подсчета сотрудников и поле для хранения их числа. И метод, и поле не принадлежат никакому экземпляру сотрудника. Они принадлежат классу компании. В связи с этим они должны объявляться как статические члены класса.

В этом примере выполняется чтение имени и идентификатора нового сотрудника, увеличение счетчика сотрудников на единицу, а также отображение сведений о новом сотруднике и нового числа сотрудников. Для простоты эта программа считывает текущее число сотрудников с клавиатуры. В реальном приложении эта информация должна считываться из файла.

    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: {0}", e.name);
        Console.WriteLine("ID:   {0}", e.id);
        Console.WriteLine("New Number of Employees: {0}",
                      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
    */

Этот пример показывает, что несмотря на то что вы можете инициализировать статическое поле посредством другого, еще не объявленного статического поля, результаты не будут определены до тех пор, пока статическому полю не будет явно присвоено значение.

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#:

  • 1.6.6.3 Методы экземпляра и статические методы

  • 5.1.1 Статические переменные

  • 10.3.7 Члены экземпляра и статические члены

  • 10.5.1 Поля экземпляра и статические поля

  • 10.5.5.1 Инициализация статических полей

  • 10.6.2 Методы экземпляра и статические методы

  • 10.7.1 Свойства экземпляра и статические свойства

  • 10.8.3 События экземпляра и статические события

  • 10.12 Статические конструкторы

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

Ключевые слова C#

Модификаторы (Справочник по C#)

Статические классы и члены статических классов (руководство по программированию в C#)

Другие ресурсы

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