Содержание
На данный момент мы уже знаем достаточно много ключевых слов, в том числе и такие как private
, public
, internal
и так далее, позволяющие указать уровень доступа членов класса. И, несмотря на то, что с ключевым словом static
мы уже встречались не раз, однако, вся его мощь чувствуется именно при работе с классами в языке C#.
Ключевое слово static
Ключевое слово static может использоваться в различных контекстах, однако сегодня речь пойдет о его использовании именно в классах C#. В русской литературе по программированию на языке C# можно встретить такие определения, как «статичный», «статический» и так далее. В любом случае, это означает, что какой-либо член класса (свойство, метод) определен с атрибутом static
.
В документации Microsoft по языку C# дословно сказано следующее:
Посмотрим, что это означает на практике.
Использование методов C# без создания объекта
До сих пор, при работе с классом Building
, который мы создавали здесь, мы вызывали методы только после того, как был создан объект типа Building
, например:
//создаем объект Building building = new Building { Width = 40, Length = 30, Height = 5 }; //вызываем метод building.ExpandSize(2, 2, 2);
При использовании же ключевого слова static
метод будет принадлежать именно классу (типу данных), а не объекту и вызвать такой метод можно без создания объекта. Для демонстрации использования модификатора static допишем наш класс следующим образом:
- добавим статическую переменную
int ordNumber
в класс, значение которой по умолчанию будет равен нулю; - создадим статический метод, который будет возвращать значение
ordNumber
. - в конструкторе класса переменная
ordNumber
будет увеличиваться на единицу.
Должен получиться вот такой код:
class Building { static int ordNumber = 0; static public int GetOrdNumber() { return ordNumber; } public Building() { width = 10; length = 10; height = 2; ordNumber++; } }
Теперь посмотрим что будет выводиться в консоли, если выполнить вот такой код:
class Program { static void Main(string[] args) { Console.WriteLine(Building.GetOrdNumber());//воспользовались статическим методом Building building1 = new Building(); //создаем новый объект Console.WriteLine(Building.GetOrdNumber());//воспользовались статическим методом Building building2 = new Building(); //создаем новый объект Console.WriteLine(Building.GetOrdNumber());//воспользовались статическим методом Building building3 = new Building(); //создаем новый объект Console.WriteLine(Building.GetOrdNumber());//воспользовались статическим методом } }
Здесь мы вызываем статический метод каждый раз после создания очередного объекта. При этом обратите внимание, что мы всегда обращаемся к статическому методу,указывая тип данных, а не ссылку на объект (по другому обратиться к статическому методу в C# нельзя). В консоли вы увидите следующий вывод:
1
2
3
Статическая переменная не обнулялась каждый раз при создании объекта, а наращивалась на единицу. И это поведение нам следует запомнить:
Инициализация статических полей
Чтобы инициализировать статическое поле в C# можно использовать такие варианты:
Присвоение значения по умолчанию
Например,как мы это сделали в нашем классе:
static int ordNumber = 0;
Использование статического конструктора
Наряду с обычными конструкторами в языке C# могут использоваться статические конструкторы, т.е конструкторы, имеющие модификатор static
. Такие конструкторы обладают следующими особенностями:
- статический конструктор нельзя перегрузить
- статический конструктор не принимает никаких параметров
- статический конструктор выполняется один раз вне зависимости от того сколько объектов данного класса создано
- исходя из п.3, статический конструктор не должен иметь никаких модификаторов доступа — он вызывается автоматически при создании первого объекта или при первом обращении к статическому члену класса.
Например, в нашем классе можно определить вот такой статический конструктор:
class Building { static int ordNumber; //статический конструктор static Building() { ordNumber = 0; } }
Статические классы
Кроме того, что вы можете объявлять статические члены класса (поля, методы, свойства), в C# вы можете объявлять статическими целые классы. Объявить статический класс можно так:
static class SomeClass { }
при этом следует помнить, что если к классу применяется ключевое слово static
, все члены этого класса должны быть static
. Где вы можете встретить статический класс C#? Одним из самых показательных примеров может быть тот самый класс Console
, методами которого мы пользуемся с самого начала знакомства с языком C#. Чтобы мы не считывали или не записывали в консоль — мы всегда используем статические методы статического класса (не создаем объект типа Console
, а используем методы класса).
Итого
Сегодня мы познакомились с ключевым словом (модификатором) static
, которое позволяет создавать члены класса, не относящиеся к конкретному объекту, а к типу данных (классу) в целом. С помощью static
можно объявлять поля,методы, свойства класса и объявлять целиком статические классы C#.