Урок 5. Статика C#


На пятом уроке учебника по объектно-ориентированному программированию на языке C# описывается использование статических методов, свойств и конструкторов. Эти модели поведения доступны из классов без необходимости создавать экземпляры новых объектов.

Зачем использовать статику?

На сегодняшний день все методы, свойства и конструкторы, описанные в этом учебнике, относятся к экземплярам объектов классов. В каждом случае эти члены определяют, как ведут себя отдельные объекты и как они поддерживают и управляют своим собственным состоянием. Иногда вы захотите создать поведение, которое не связано с каким-либо отдельным объектом, а доступно для всех экземпляров и объектов других классов. Именно здесь статические члены становятся полезными.

Хорошим примером статического метода является основной метод, который используется в каждой исполняемой программе. При запуске программы в памяти нет экземпляров какого-либо класса. Поскольку основной метод является статическим, он может быть вызван без создания объекта и затем может взять на себя управление программой. Основной задачей метода является создание объектов, которые необходимы программе для правильной работы.

В этой статье мы создадим новый класс утилит, который выполняет простой научный расчет. Этот класс предоставляет метод, который принимает плотность и объем элемента и вычисляет его массу. Класс также будет поддерживать свойство, которое подсчитывает количество выполненных вычислений. Для начала создайте новое консольное приложение и добавьте новый класс с именем "MassCalculator".

Статический метод

Статические методы полезны при создании функций, которые не зависят от какого-либо экземпляра класса. Примером широкого использования статических членов является класс Math, представляющий собой библиотеку математических функций и констант, предоставляемых платформой .NET framework.

Создание статического метода

Статический метод объявляется с использованием синтаксиса, аналогичного синтаксису метода класса. Ключевое слово static используется в объявлении для указания измененного поведения. Чтобы добавить метод расчета массы в новый класс, вставьте следующий код:

public static int CalculateMass(int density, int volume)
{
    return density * volume;
}
Вызов статического метода

Статические методы вызываются без ссылки на конкретный экземпляр класса. Вместо указания имени объекта, за которым следует имя метода, используются имя класса и имя метода, разделенные точкой (или точкой). Мы можем продемонстрировать это с помощью основного метода консольного приложения следующим образом:

static void Main(string[] args)
{
    int density = 50;
    int volume = 100;
    int mass = MassCalculator.CalculateMass(density, volume);
 
    Console.WriteLine("Mass: {0}", mass);           // "Mass: 5000"
}
Важно понимать, что статические методы не могут напрямую использовать нестатические члены. Недопустимо, чтобы один статический метод напрямую вызывал нестатический метод или свойство без первого экземпляра объекта. Аналогичным образом, частные переменные, которые не помечены как статические, не могут быть использованы статическим методом. Обратное этому, конечно, неверно, так как нестатический член может вызывать статический метод.

Статическое свойство

Статические свойства обеспечивают функциональность стандартных свойств, за исключением того, что свойство не связано ни с одним экземпляром класса. Свойства могут быть доступны для чтения / записи, только для чтения или только для записи, как и стандартные свойства. Таким образом, их можно рассматривать как глобальные переменные.

Создание статической переменной private

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

В классе MassCalculator мы реализуем счетчик вызовов, который увеличивается при каждом использовании метода вычисления массы. Текущее значение счетчика вызовов хранится в статической частной переменной, которая теперь может быть добавлена в блок кода класса:

private static int _callCount;
Настройте метод CalculateMass так, чтобы он увеличивал переменную при каждом вызове:

public static int CalculateMass(int density, int volume)
{
    _callCount++;
    return density * volume;
}
Предоставление статического свойства

Как и следовало ожидать, добавление статического свойства в класс требует только, чтобы объявление включало ключевое слово "static" для изменения поведения свойства. Теперь мы можем добавить в класс свойство счетчика вызовов только для чтения.

public static int CallCount
{
    get
    {
        return _callCount;
    }
}
Использование статического свойства

Для использования статического свойства имя свойства предваряется именем класса и оператором доступа к члену (.). Чтобы продемонстрировать, настройте метод Main для выполнения двух массовых вычислений и выведите свойство Call count следующим образом:

static void Main(string[] args)
{
    int density = 50;
    int volume = 100;
    int volume2 = 180;
 
    int mass1 = MassCalculator.CalculateMass(density, volume);
    int mass2 = MassCalculator.CalculateMass(density, volume2);
    int calls = MassCalculator.CallCount;
 
    Console.WriteLine("Mass1: {0}", mass1);         // "Mass1: 5000"
    Console.WriteLine("Mass2: {0}", mass2);         // "Mass2: 9000"
    Console.WriteLine("Calls: {0}", calls);         // "Calls: 2"
}
Статический конструктор

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

Чтобы добавить статический конструктор, создайте частный конструктор с ключевым словом static в качестве префикса. следующий код можно было бы добавить в класс MassCalculator, если бы были доступны соответствующие статические методы для извлечения ранее сохраненного количества вызовов из файла или другого хранилища.

static MassCalculator()
{
    _callCount = InitialiseCallCount();
}
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, си шарп, ООП




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.



Пример создания игры на флеш: часть 1
Анализ алгоритмов: теория
Поля и методы в Java: рекурсия и стек вызовов метода