Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
На этой странице рассматривается ключевое static
слово модификатора. Ключевое static
слово также является частью директивы using static
.
static
Используйте модификатор для объявления статического элемента, который принадлежит самому типу, а не конкретному объекту. Модификатор static
можно использовать для объявления классов static
. В классах, интерфейсах и структурах можно добавить static
модификатор в поля, методы, свойства, операторы, события и конструкторы.
static
Модификатор нельзя использовать с индексаторами или финализаторами. Дополнительные сведения см. в статье Статические классы и члены статических классов.
Модификатор static
можно добавить в локальную функцию. Статическая локальная функция не может захватывать локальные переменные или состояние экземпляра.
class Calc1
{
public void CalculateSum()
{
int a = 3;
int b = 7;
// Static local function - cannot access 'a' or 'b' directly
static int Add(int x, int y)
{
return x + y;
}
int result = Add(a, b);
Console.WriteLine($"Sum: {result}");
}
}
/*
Output:
Sum: 10
*/
Модификатор можно добавить в static
лямбда-выражение или анонимный метод. Статический лямбда-метод или анонимный метод не может записывать локальные переменные или состояние экземпляра.
class Calc2
{
static void Main()
{
Func<int, int, int> add = static (a, b) => a + b;
int result = add(5, 10);
Console.WriteLine($"Sum: {result}");
}
}
/*
Output:
Sum: 15
*/
Пример — статический класс
Следующий класс объявляется как 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++ см. в разделе "Классы хранилища" (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#.