Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 113
- Предыдущая
- 113/642
- Следующая
class SavingsAccount
{
public double currBalance;
// Статические данные.
public static double currInterestRate = 0.04;
...
}
Такой подход обеспечит установку статического поля только один раз независимо от того, сколько объектов создается. Но что, если значение статических данных необходимо получать во время выполнения? Например, в типичном банковском приложении значение переменной, представляющей процентную ставку, будет читаться из базы данных или внешнего файла. Решение задач подобного рода обычно требует области действия метода, такого как конструктор, для выполнения соответствующих операторов кода.
По этой причине язык C# позволяет определять статический конструктор, который дает возможность безопасно устанавливать значения статических данных. Взгляните на следующее изменение в коде класса:
class SavingsAccount
{
public double currBalance;
public static double currInterestRate;
public SavingsAccount(double balance)
{
currBalance = balance;
}
<b>// Статический конструктор!</b>
static SavingsAccount()
{
Console.WriteLine("In static ctor!");
currInterestRate = 0.04;
}
...
}
Выражаясь просто, статический конструктор представляет собой специальный конструктор, который является идеальным местом для инициализации значений статических данных, если их значения не известны на этапе компиляции (например, когда значения нужно прочитать из внешнего файла или базы данных, сгенерировать случайные числа либо получить значения еще каким-нибудь способом). Если вы снова запустите предыдущий код, то увидите ожидаемый вывод. Обратите внимание, что сообщение
"In static ctor!"
***** 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
<b>// Это работает нормально.</b>
TimeUtilClass.PrintDate();
TimeUtilClass.PrintTime();
<b>// Ошибка на этапе компиляции!</b>
<b>// Создавать экземпляры статического класса невозможно!</b>
TimeUtilClass u = new TimeUtilClass ();
Console.ReadLine();
- Предыдущая
- 113/642
- Следующая