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

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

Жанры

Язык программирования 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
, как показано ниже:

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

Семья. Измена. Развод

Высоцкая Мария Николаевна
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Семья. Измена. Развод

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

На границе империй. Том 4

INDIGO
4. Фортуна дама переменчивая
Фантастика:
космическая фантастика
6.00
рейтинг книги
На границе империй. Том 4

Искушение генерала драконов

Лунёва Мария
2. Генералы драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Искушение генерала драконов

Шаг в бездну

Муравьёв Константин Николаевич
3. Перешагнуть пропасть
Фантастика:
фэнтези
космическая фантастика
7.89
рейтинг книги
Шаг в бездну

Камень Книга одиннадцатая

Минин Станислав
11. Камень
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Камень Книга одиннадцатая

Никто и звать никак

Ром Полина
Фантастика:
фэнтези
7.18
рейтинг книги
Никто и звать никак

Возвышение Меркурия. Книга 14

Кронос Александр
14. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 14

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

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

Генерал Скала и ученица

Суббота Светлана
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Генерал Скала и ученица

Пограничная река. (Тетралогия)

Каменистый Артем
Пограничная река
Фантастика:
фэнтези
боевая фантастика
9.13
рейтинг книги
Пограничная река. (Тетралогия)

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Сумеречный Стрелок 2

Карелин Сергей Витальевич
2. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 2

Сумеречный Стрелок 10

Карелин Сергей Витальевич
10. Сумеречный стрелок
Фантастика:
рпг
аниме
фэнтези
5.00
рейтинг книги
Сумеречный Стрелок 10