Чтение онлайн

на главную - закладки

Жанры

Язык программирования C#9 и платформа .NET5
Шрифт:

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

class SavingsAccount

{

public double currBalance;

public static double currInterestRate;

public SavingsAccount(double balance)

{

currBalance = balance;

}

//
Статический конструктор!

static SavingsAccount

{

Console.WriteLine("In static ctor!");

currInterestRate = 0.04;

}

...

}

Выражаясь просто, статический конструктор представляет собой специальный конструктор, который является идеальным местом для инициализации значений статических данных, если их значения не известны на этапе компиляции (например, когда значения нужно прочитать из внешнего файла или базы данных, сгенерировать случайные числа либо получить значения еще каким-нибудь способом). Если вы снова запустите предыдущий код, то увидите ожидаемый вывод. Обратите внимание, что сообщение

"In static ctor!"
выводится только один раз, т.к. среда CoreCLR вызывает все статические конструкторы перед первым использованием (и никогда не вызывает их заново для данного экземпляра приложения):

***** Fun with Static Data *****

In static ctor!

Interest Rate is: 0.04

Interest Rate is: 0.08

Ниже отмечено несколько интересных моментов, касающихся статических конструкторов.

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

• Статический конструктор не имеет модификатора доступа и не может принимать параметры.

• Статический конструктор выполняется только один раз вне зависимости от количества создаваемых объектов заданного класса.

• Исполняющая система вызывает статический конструктор, когда создает экземпляр класса или перед доступом к первому статическому члену из вызывающего кода.

• Статический конструктор выполняется перед любым конструктором уровня экземпляра.

С учетом такой модификации при создании новых объектов

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

Определение статических классов

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

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

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

На первый

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

using System;

namespace StaticDataAndMembers

{

// Статические классы могут содержать только статические члены!

static class TimeUtilClass

{

public static void PrintTime

=> Console.WriteLine(DateTime.Now.ToShortTimeString);

public static void PrintDate

=> Console.WriteLine(DateTime.Today.ToShortDateString);

}

}

Так как класс

TimeUtilClass
определен с ключевым словом
static
, создавать его экземпляры с помощью ключевого слова
new
нельзя. Взамен вся функциональность доступна на уровне класса. Чтобы протестировать данный класс, добавьте к операторам верхнего уровня следующий код:

// Это работает нормально.

TimeUtilClass.PrintDate;

TimeUtilClass.PrintTime;

// Ошибка на этапе компиляции!

// Создавать экземпляры статического класса невозможно!

TimeUtilClass u = new TimeUtilClass ;

Console.ReadLine;

Импортирование статических членов с применением ключевого слова using языка C#

В версии C# 6 появилась поддержка импортирования статических членов с помощью ключевого слова

using
. В качестве примера предположим, что в файле C# определен обслуживающий класс. Поскольку в нем делаются вызовы метода
WriteLine
класса
Console
, а также обращения к свойствам
Now
и
Today
класса
DateTime
, должен быть предусмотрен оператор
using
для пространства имен
System
. Из-за того, что все члены упомянутых классов являются статическими, в файле кода можно указать следующие директивы
using static
:

// Импортировать статические члены классов Console и DateTime.

using static System.Console;

using static System.DateTime;

После такого "статического импортирования" в файле кода появляется возможность напрямую применять статические методы классов

Console
и
DateTime
, не снабжая их префиксом в виде имени класса, в котором они определены. Например, модифицируем наш обслуживающий класс
TimeUtilClass
, как показано ниже:

Поделиться:
Популярные книги

Тройняшки не по плану. Идеальный генофонд

Лесневская Вероника
Роковые подмены
Любовные романы:
современные любовные романы
6.80
рейтинг книги
Тройняшки не по плану. Идеальный генофонд

Барон играет по своим правилам

Ренгач Евгений
5. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Барон играет по своим правилам

Завод-3: назад в СССР

Гуров Валерий Александрович
3. Завод
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Завод-3: назад в СССР

Секретарь лорда Демона

Лунёва Мария
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Секретарь лорда Демона

Отец моего жениха

Салах Алайна
Любовные романы:
современные любовные романы
7.79
рейтинг книги
Отец моего жениха

Идеальный мир для Лекаря 10

Сапфир Олег
10. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 10

Я тебя не отпущу

Коваленко Марья Сергеевна
4. Оголенные чувства
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Я тебя не отпущу

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Девочка из прошлого

Тоцка Тала
3. Айдаровы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Девочка из прошлого

Вернуть невесту. Ловушка для попаданки 2

Ардова Алиса
2. Вернуть невесту
Любовные романы:
любовно-фантастические романы
7.88
рейтинг книги
Вернуть невесту. Ловушка для попаданки 2

Идеальный мир для Лекаря 7

Сапфир Олег
7. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 7

Хозяйка дома на холме

Скор Элен
1. Хозяйка своей судьбы
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка дома на холме

Жена проклятого некроманта

Рахманова Диана
Фантастика:
фэнтези
6.60
рейтинг книги
Жена проклятого некроманта

Имя нам Легион. Том 9

Дорничев Дмитрий
9. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 9