Классы и объекты C#: ключевое слово static

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

На данный момент мы уже знаем достаточно много ключевых слов, в том числе и такие как private, public, internal и так далее, позволяющие указать уровень доступа членов класса. И, несмотря на то, что с ключевым словом static мы уже встречались не раз, однако, вся его мощь чувствуется именно при работе с классами в языке C#.

Ключевое слово static

Ключевое слово static может использоваться в различных контекстах, однако сегодня речь пойдет о его использовании именно в классах C#. В русской литературе по программированию на языке C# можно встретить такие определения, как «статичный», «статический» и так далее. В любом случае, это означает, что какой-либо член класса (свойство, метод) определен с атрибутом static.

В документации Microsoft по языку C# дословно сказано следующее:

Модификатор static используется для объявления статического члена, принадлежащего собственно типу, а не конкретному объекту.<span class="su-quote-cite"><a href="https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/static" target="_blank">Microsoft</a></span>

Посмотрим, что это означает на практике.

Использование методов C# без  создания объекта

До сих пор, при работе с классом Building, который мы создавали здесь, мы вызывали методы только после того, как был создан объект типа Building, например:

//создаем объект
Building building = new Building { Width = 40, Length = 30, Height = 5 };
//вызываем метод
building.ExpandSize(2, 2, 2);

При использовании же ключевого слова static метод будет принадлежать именно классу (типу данных), а не объекту и вызвать такой метод можно без создания объекта. Для демонстрации использования модификатора static допишем наш класс следующим образом:

  1. добавим статическую переменную int ordNumber в класс, значение которой по умолчанию будет равен нулю;
  2. создадим статический метод, который будет возвращать значение ordNumber.
  3. в конструкторе класса переменная 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# нельзя). В консоли вы увидите следующий вывод:

0

1

2

3

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

НЕстатические переменные у каждого объекта свои, статические переменные — общие для всех объектов класса. На уровне памяти для каждой статической переменной выделяется один участок памяти для всех объектов.

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

Чтобы инициализировать статическое поле в C# можно использовать такие варианты:

Присвоение значения по умолчанию

Например,как мы это сделали в нашем классе:

static int ordNumber = 0;

Использование статического конструктора

Наряду с обычными конструкторами в языке C# могут использоваться статические конструкторы, т.е конструкторы, имеющие модификатор static. Такие конструкторы обладают следующими особенностями:

  1. статический конструктор нельзя перегрузить
  2. статический конструктор не принимает никаких параметров
  3. статический конструктор выполняется один раз вне зависимости от того сколько объектов данного класса создано
  4. исходя из п.3, статический конструктор не должен иметь никаких модификаторов доступа — он вызывается автоматически при создании первого объекта или при первом обращении к статическому члену класса.

Например, в нашем классе можно определить вот такой статический конструктор:

class Building
{
    static int ordNumber;
    //статический конструктор
    static Building()
    {
        ordNumber = 0;
    }
}

Статические классы

Кроме того, что вы можете объявлять статические члены класса (поля, методы, свойства), в C# вы можете объявлять статическими целые классы. Объявить статический класс можно так:

static class SomeClass
 {

 }

при этом следует помнить, что если к классу применяется ключевое слово static, все члены этого класса должны быть static.  Где вы можете встретить статический класс C#? Одним из самых показательных примеров может быть тот самый класс Console, методами которого мы пользуемся с самого начала знакомства с языком C#.  Чтобы мы не считывали или не записывали в консоль — мы всегда используем статические методы статического класса (не создаем объект типа Console, а используем методы класса).

Итого

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

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
guest
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии