Static c что это
Кроме обычных полей, методов, свойств классы и структуры могут иметь статические поля, методы, свойства. Статические поля, методы, свойства относятся ко всему классу/всей структуре и для обращения к подобным членам необязательно создавать экземпляр класса / структуры.
Статические поля
Статические поля хранят состояние всего класса / структуры. Статическое поле определяется как и обычное, только перед типом поля указывается ключевое слово static . Например, рассмотрим класс Person, который представляет человека:
В данном случае класс Person имеет два поля: age (хранит возраст человека) и retirementAge (хранит пенсионный возраст). Однако поле retirementAge является статическим. Оно относится не к конкретному человеку, а ко всем людям. (В данном случае для упрощения пренебрежем тем фактом, что в зависимости от пола и профессии пенсионный возраст может отличаться.) Таким образом, поле retirementAge относится не к отдельную объекту и хранит значение НЕ отдельного объекта класса Person, а относится ко всему классу Person и хранит общее значение для всего класса.
Причем в самом классе мы можем использовать это поле как и любые другие. Так, в методе СheckAge() , который поверяет пенсионный статус человека, для проверки используем это поле:
Но если мы хотим обратиться к этому полю вне своего класса, то мы можем обращаться к этому полю по имени класса:
На уровне памяти для статических полей будет создаваться участок в памяти, который будет общим для всех объектов класса.

При этом память для статических переменных выделяется даже в том случае, если не создано ни одного объекта этого класса.
Статические свойства
Подобным образом мы можем создавать и использовать статические свойства:
В данном случае доступ к статической переменной retirementAge опосредуется с помощью статического свойства RetirementAge .
Таким образом, переменные и свойства, которые хранят состояние, общее для всех объектов класса / структуры, следует определять как статические.
Нередко статические поля и свойства применяются для хранения счетчиков. Например, мы хотим иметь счетчик, который позволял бы узнать, сколько объектов Person создано:
В данном случае в классе Person счетчик хранится в приватной переменной counter, значение которой увеличивается на единицу при создании объекта в конструкторе. А с помощью статического свойства Counter, которое доступно только для чтения, мы можем получить значение счетчика.
Статические методы
Статические методы определяют общее для всех объектов поведение, которое не зависит от конкретного объекта. Для обращения к статическим методам также применяется имя класса / структуры:
В данном случае в классе Person определен статический метод CheckRetirementStatus() , который в качестве параметра принимает объект Person и проверяет его пенсионный статус.
Следует учитывать, что статические методы могут обращаться только к статическим членам класса. Обращаться к нестатическим методам, полям, свойствам внутри статического метода мы не можем.
Статический конструктор
Кроме обычных конструкторов у класса также могут быть статические конструкторы. Статические конструкторы имеют следующие отличительные черты:
Статические конструкторы не должны иметь модификатор доступа и не принимают параметров
Как и в статических методах, в статических конструкторах нельзя использовать ключевое слово this для ссылки на текущий объект класса и можно обращаться только к статическим членам класса
Статические конструкторы нельзя вызвать в программе вручную. Они выполняются автоматически при самом первом создании объекта данного класса или при первом обращении к его статическим членам (если таковые имеются)
Статические конструкторы обычно используются для инициализации статических данных, либо же выполняют действия, которые требуется выполнить только один раз
Определим статический конструктор:
В данном случае с помощью встроенной структуры DateTime получаем текущий год. Для этого используется свойство DateTime.Now.Year . если он равен 2022, устанавливаем один пенсионный возраст. При другом значении текущего года устанавливается другое значение пенсионного возраста.
Статические классы
Статические классы объявляются с модификатором static и могут содержать только статические поля, свойства и методы. Например, определим класс, который выполняет ряд арифметических операций:
Ключевое слово static

Иногда требуется определить такой член класса, который будет использоваться независимо от всех остальных объектов этого класса. Как правило, доступ к члену класса организуется посредством объекта этого класса, но в то же время можно создать член класса для самостоятельного применения без ссылки на конкретный экземпляр объекта. Для того чтобы создать такой член класса, достаточно указать в самом начале его объявления ключевое слово static.
Если член класса объявляется как static, то он становится доступным до создания любых объектов своего класса и без ссылки на какой-нибудь объект. С помощью ключевого слова static можно объявлять как переменные, так и методы. Наиболее характерным примером члена типа static служит метод Main(), который объявляется таковым потому, что он должен вызываться операционной системой в самом начале выполняемой программы.
Для того чтобы воспользоваться членом типа static за пределами класса, достаточно указать имя этого класса с оператором-точкой. Но создавать объект для этого не нужно. В действительности член типа static оказывается доступным не по ссылке на объект, а по имени своего класса.
Переменные, объявляемые как static, по существу, являются глобальными. Когда же объекты объявляются в своем классе, то копия переменной типа static не создается. Вместо этого все экземпляры класса совместно пользуются одной и той же переменной типа static. Такая переменная инициализируется перед ее применением в классе.
Пример использования ключевого слова static:

На применение методов типа static накладывается ряд следующих ограничений:
В методе типа static должна отсутствовать ссылка this, поскольку такой метод не выполняется относительно какого-либо объекта
В методе типа static допускается непосредственный вызов только других методов типа static, но не метода экземпляра из того самого же класса. Дело в том, что методы экземпляра оперируют конкретными объектами, а метод типа static не вызывается для объекта. Следовательно, у такого метода отсутствуют объекты, которыми он мог бы оперировать
Аналогичные ограничения накладываются на данные типа static. Для метода типа static непосредственно доступными оказываются только другие данные типа static, определенные в его классе. Он, в частности, не может оперировать переменной экземпляра своего класса, поскольку у него отсутствуют объекты, которыми он мог бы оперировать
Статические конструкторы
Конструктор можно также объявить как static. Статический конструктор, как правило, используется для инициализации компонентов, применяемых ко всему классу, а не к отдельному экземпляру объекта этого класса. Поэтому члены класса инициализируются статическим конструктором до создания каких-либо объектов этого класса:
Обратите внимание на то, что конструктор типа static вызывается автоматически, когда класс загружается впервые, причем до конструктора экземпляра. Из этого можно сделать более общий вывод: статический конструктор должен выполняться до любого конструктора экземпляра. Более того, у статических конструкторов отсутствуют модификаторы доступа — они пользуются доступом по умолчанию, а следовательно, их нельзя вызывать из программы.
Статические классы
Класс можно объявлять как static. Статический класс обладает двумя основными свойствами. Во-первых, объекты статического класса создавать нельзя. И во-вторых, статический класс должен содержать только статические члены. Статический класс создается по приведенной ниже форме объявления класса, видоизмененной с помощью ключевого слова static.
Статические классы применяются главным образом в двух случаях. Во-первых, статический класс требуется при создании метода расширения. Методы расширения связаны в основном с языком LINQ. И во-вторых, статический класс служит для хранения совокупности связанных друг с другом статических методов:

Стоит отметить, что для статического класса не допускается наличие конструктора экземпляра, но у него может быть статический конструктор.
Статические классы, методы, переменные. Статические конструкторы. Ключевое слово static
Чтобы класс (метод, переменная) был статическим, перед его объявлением ставится ключевое слово static .
⇑
2. Понятие статического класса. Какие особенности использования статических классов в программах на C#? Ключевое слово static
С точки зрения синтаксиса C# статический класс – это класс, который объявляется с ключевым словом static.
Общая форма объявления статического класса:
где ClassName – имя статического класса.
⇑
3. Свойства статического класса
Реализация программного кода статического класса ничем не отличается от программного кода обычного класса за исключением двух основных свойств. В сравнении с нестатическим классом, статический класс имеет следующие свойства (отличия):
- нельзя создавать объекты статического класса;
- статический класс должен содержать только статические члены.
⇑
4. Примеры, которые демонстрируют свойства статического класса
Пример 1. Пусть задан статический класс MyStaticClass . В этом классе объявляется один статический член с именем d .
Если попробовать создать объект статического класса
то возникнет ошибка компиляции с сообщением:
Пример 2. Данный пример демонстрирует правило, что статический класс должен содержать только статические члены. Пусть задан статический класс MyStaticClass . Если в статическом классе MyStaticClass попробовать объявить нестатический член d целого типа
то во время компиляции компилятор выдаст следующую ошибку:
⇑
5. Примеры статических классов
Пример 1. В данном примере демонстрируется использование статической переменной в статическом классе. Объявляется статический класс с именем Count , в котором помещается одна статическая переменная count . Эта статическая переменная есть счетчиком, который совместно используется в нестатических методах Add1() , Add2() другого класса Methods .
Программный код классов Count и Methods следующий:
В нижеследующем коде продемонстрированы обращения к переменной count класса Count и изменение значения этой переменной из методов Add1() , Add2() .
Как видно из примера, статический член данных Count.count есть общим для методов Add1() , Add2() класса Methods . Если бы в программе были реализованы другие классы с некоторыми методами, то к этому члену данных можно было бы обращаться из этих методов.
Если в данном примере класс Count объявить как нестатический (без ключевого слова static )
то результат работы программы не изменится. Статическую переменную Count.count можно использовать как общий ресурс.
Пример 2. Пример демонстрирует использование статического метода в нестатическом классе. Статический метод выступает общим ресурсом, который выполняет некоторую общую работу.
В примере объявляется статический метод AbsComplex() , находящий модуль комплексного числа. Метод объявляется в классе ComplexLibrary . Также объявляются 2 класса, которые содержат методы, использующие метод AbsComplex() в своих вычислениях.
Использование методов классов CalcComplex1 , CalcComplex2 может быть следующим:
⇑
6. Какие преимущества применения статических классов, методов и переменных в программах на C#?
Статические классы, методы и переменные эффективны в следующих случаях:
- если нужно создать так называемые методы расширения. Методы расширения используются для расширения функций класса. Эти методы являются статическими;
- если в программе есть некоторый общий ресурс, к которому могут иметь обращение методы разных классов что обрабатывают данный ресурс (читают или изменяют его значение). Этот общий ресурс объявляется как статическая переменная. Например, таким ресурсом может быть некоторый счетчик вызовов, метод что реализует уникальную обработку, уникальная файловая переменная (ресурс) и т.п.;
- статические классы являются эффективными, когда нужно объединить между собой группы статических методов;
- если нужно использовать общие скрытые ( private ) данные класса и организовывать доступ к этим данным из статических и нестатических методов.
⇑
7. Чем отличается вызов статического метода от нестатического?
В любом нестатическом классе могут быть объявлены как статические методы, так и нестатические. Отличие между вызовом статического и нестатического метода класса состоит в следующем:
- чтобы вызвать нестатический метод класса, нужно создать экземпляр (объект) этого класса. Статический метод вызывается без создания объекта класса – перед именем метода указывается имя класса, в котором этот статический метод объявлен.
Например. Задан нестатический класс Sqr , содержащий следующие два метода, которые возвращают квадрат целочисленного значения:
- GetSqr() – нестатический метод;
- GetSqrStatic() – статический метод.
Ниже демонстрируется вызов и использование этих методов:
Как видно из вышеприведенного кода, чтобы вызвать статический метод некоторого класса, перед его именем нужно указать имя этого класса.
⇑
8. Можно ли объявить скрытый ( private ) статический член в некотором классе?
Да можно. В этом случае этот статический член класса будет доступным только в границах этого класса, то есть из методов этого класса. Доступ из методов других классов будет невозможен.
⇑
9. Можно ли объявлять статический член класса с модификатором доступа protected ?
Да можно. В этом случае, доступ к статического члену класса будут иметь методы класса, которые унаследованы от данного класса.
Например. Задан класс A , содержащий один статический член a , который объявлен как protected . Также задан класс B , который наследует (расширяет) класс A . Из метода SomeMethod() класса B осуществляется доступ к protected -переменной класса A .
⇑
10. Может ли нестатический класс содержать статические переменные и статические методы?
Да может. Примеры использования статических методов в нестатическом классе приведены в пунктах 5 и 7.
⇑
11. Можно ли объединять статические и нестатические методы в одном классе?
Да, можно. Но только в нестатическом классе. Если класс объявлен как статический, то все методы и переменные класса должны быть также статическими (см. п. 4 — Пример 2).
Например. Пример демонстрирует объединение статического и нестатического методов класса для доступа к скрытой статической переменной t в классе. Объявляется нестатический класс CMyClass , содержащий статическую переменную, статический и нестатический методы доступа к ней.
В нижеследующем коде продемонстрирован доступ к скрытой статической переменной t класса CMyClass
Данный пример хорошо демонстрирует, как можно организовать работу с общими, скрытыми данными класса.
⇑
12. Можно ли в статическом методе статического класса создать объект нестатического класса?
Да, можно. Классический пример этому, функция Main() для консольных приложений. Эта функция объявлена как static . Однако, создавать экземпляры любых нестатических классов в этой функции можно.
⇑
13. Что такое статические конструкторы? Пример
Статические конструкторы позволяют инициализировать статические переменные класса.
Пример. Демонстрируется объявление статического конструктора в классе.
Демонстрация работы класса CCount в некотором методе
⇑
14. Какие правила (особенности) использования статических конструкторов?
При использовании статических конструкторов нужно обратить внимание на следующие правила:
- перед статическим конструктором должно указываться ключевое слово static ;
- в классе может быть только один статический конструктор. Это значит, что статический конструктор нельзя перегружать;
- статические конструкторы вызываются когда создается экземпляр класса или когда идет обращение к статическому члену этого класса;
- статический конструктор в программе выполняется только один раз. Даже если создать несколько экземпляров класса, содержащего статический конструктор, все равно этот статический конструктор выполнится только один раз;
- у статических конструкторов не может быть модификаторов доступа ( public , private );
- если в классе есть статический конструктор и конструктор создающий экземпляр (или несколько конструкторов), то статический конструктор вызывается первым;
- статический конструктор не может иметь параметров. Если попробовать создать параметризированный статический конструктор в классе, то возникнет ошибка компиляции.
⇑
15. Можно ли из статических конструкторов инициализировать нестатические переменные класса?
Нет, нельзя. Из статических конструкторов можно инициализировать только статические переменные этого же класса. Если в этом классе также объявляются нестатические переменные, то доступа к ним из статических конструкторов нету.
Name already in use
docs / docs / csharp / language-reference / keywords / static.md
- Go to file T
- Go to line L
- Copy path
- Copy permalink
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
static (C# Reference)
This page covers the static modifier keyword. The static keyword is also part of the using static directive.
Use the static modifier to declare a static member, which belongs to the type itself rather than to a specific object. The static modifier can be used to declare static classes. In classes, interfaces, and structs, you may add the static modifier to fields, methods, properties, operators, events, and constructors. The static modifier can’t be used with indexers or finalizers. For more information, see Static Classes and Static Class Members.
You can add the static modifier to a local function. A static local function can’t capture local variables or instance state.
Beginning with C# 9.0, you can add the static modifier to a lambda expression or anonymous method. A static lambda or anonymous method can’t capture local variables or instance state.
Example — static class
The following class is declared as static and contains only static methods:
A constant or type declaration is implicitly a static member. A static member can’t be referenced through an instance. Instead, it’s referenced through the type name. For example, consider the following class:
To refer to the static member x , use the fully qualified name, MyBaseC.MyStruct.x , unless the member is accessible from the same scope:
While an instance of a class contains a separate copy of all instance fields of the class, there’s only one copy of each static field.
It isn’t possible to use this to reference static methods or property accessors.
If the static keyword is applied to a class, all the members of the class must be static .
Classes, interfaces, and static classes may have static constructors. A static constructor is called at some point between when the program starts and the class is instantiated.
[!NOTE] The static keyword has more limited uses than in 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 don’t belong to any one employee instance. Instead, they belong to the class of employees as a whole. They should be declared as static members of the class.
Example — static field and method
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. This program reads the current number of employees from the keyboard.
Example — static initialization
This example shows that you can initialize a static field by using another static field that is not yet declared. The results will be undefined until you explicitly assign a value to the static field.