Статические конструкторы
Инициализируйте статическое состояние ровно один раз.
«Статические конструкторы» — бесплатный урок C# Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.
Что такое статический конструктор
Статический конструктор инициализирует статические данные класса. Он автоматически выполняется один раз перед первым использованием класса, и напрямую вызвать его нельзя.
using System;
class App
{
public static string Version;
static App()
{
Version = "1.0.0";
Console.WriteLine("Static constructor ran");
}
}
class Program
{
static void Main()
{
Console.WriteLine(App.Version);
}
}Правила синтаксиса
Статический конструктор использует ключевое слово static, имеет имя класса, не принимает параметров и не имеет модификатора доступа.
using System;
class Config
{
public static int MaxUsers;
static Config()
{
MaxUsers = 100;
}
}
class Program
{
static void Main()
{
Console.WriteLine("Max: " + Config.MaxUsers);
}
}Выполняется ровно один раз
Сколько бы раз Вы ни использовали класс, статический конструктор выполняется только один раз — при первой необходимости.
using System;
class Counter
{
public static int Instances;
static Counter()
{
Console.WriteLine("Initializing static state");
Instances = 0;
}
public Counter() { Instances++; }
}
class Program
{
static void Main()
{
new Counter();
new Counter();
Console.WriteLine("Instances: " + Counter.Instances);
}
}Когда он запускается
Среда выполнения вызывает его непосредственно перед первым обращением к любому статическому члену OR перед первым созданием экземпляра — в зависимости от того, что произойдёт раньше.
using System;
class Lazy
{
public static string Data;
static Lazy()
{
Console.WriteLine("Triggered now");
Data = "ready";
}
}
class Program
{
static void Main()
{
Console.WriteLine("Before access");
Console.WriteLine(Lazy.Data);
}
}Инициализация сложных статических данных
Используйте статический конструктор, когда для настройки статических полей требуется выполнить логику, а не просто присвоить простые литералы.
using System;
using System.Collections.Generic;
class Lookup
{
public static Dictionary<int, string> Table;
static Lookup()
{
Table = new Dictionary<int, string>();
for (int i = 1; i <= 3; i++)
Table[i] = "Item" + i;
}
}
class Program
{
static void Main()
{
Console.WriteLine(Lookup.Table[2]);
}
}Статический конструктор и инициализатор поля
Для простых значений можно использовать встроенные инициализаторы. Статический конструктор нужен для настройки, требующей операторов, циклов или обработки ошибок.
using System;
class Settings
{
public static int Simple = 10; // inline initializer
public static int Computed; // needs logic
static Settings()
{
Computed = Simple * Simple;
}
}
class Program
{
static void Main()
{
Console.WriteLine(Settings.Simple + ", " + Settings.Computed);
}
}Параметры не допускаются
Поскольку среда выполнения вызывает статический конструктор самостоятельно, он не может принимать аргументы. Все его входные данные должны быть другими статическими данными или константами.
using System;
class Clock
{
public static int StartHour;
static Clock()
{
StartHour = 9;
}
}
class Program
{
static void Main()
{
Console.WriteLine("Start: " + Clock.StartHour);
}
}Сочетание статических конструкторов и конструкторов экземпляра
Класс может иметь оба вида конструкторов. Статический выполняется один раз для типа, а конструктор экземпляра — для каждого объекта.
using System;
class Game
{
public static string Title;
public int Score;
static Game()
{
Title = "Coddy Quest";
}
public Game(int score)
{
Score = score;
}
}
class Program
{
static void Main()
{
var g = new Game(50);
Console.WriteLine(Game.Title + " score " + g.Score);
}
}Гарантированный порядок
Статический конструктор гарантированно завершает работу до выполнения тела любого конструктора экземпляра, из-за которого он запускается, поэтому статическое состояние всегда готово.
using System;
class Service
{
public static string Endpoint;
static Service()
{
Endpoint = "https://api.example.com";
}
public Service()
{
Console.WriteLine("Using " + Endpoint);
}
}
class Program
{
static void Main()
{
new Service();
}
}Используйте умеренно
Статические конструкторы добавляют однократную проверку перед использованием класса и могут снизить производительность при чрезмерном использовании или возникновении исключений. Делайте их небольшими и надёжными.
using System;
class Cache
{
public static int[] Data;
static Cache()
{
Data = new int[] { 2, 4, 6, 8 };
}
}
class Program
{
static void Main()
{
Console.WriteLine(Cache.Data[3]);
}
}Объединение всего вместе
Статические конструкторы идеально подходят для однократной настройки общих данных, доступных только для чтения, например таблиц поиска или конфигурации, заданной константами.
using System;
using System.Collections.Generic;
class Currency
{
public static Dictionary<string, string> Symbols;
static Currency()
{
Symbols = new Dictionary<string, string>
{
["USD"] = "$",
["EUR"] = "E",
["JPY"] = "Y"
};
}
}
class Program
{
static void Main()
{
Console.WriteLine("USD symbol: " + Currency.Symbols["USD"]);
}
}Быстрая проверка
Проверьте, насколько хорошо Вы поняли статические конструкторы.
Итоги
Статический конструктор использует static ClassName(), не принимает параметров и не имеет модификатора доступа. Он автоматически выполняется один раз перед первым использованием класса, чтобы инициализировать статическое состояние, требующее настоящей логики. Используйте его умеренно для однократной настройки общих данных.
using System;
class Demo
{
public static int Value;
static Demo() { Value = 42; }
}
class Program
{
static void Main()
{
Console.WriteLine(Demo.Value);
}
}Часто задаваемые вопросы
Урок «Статические конструкторы» бесплатный?
Да — полный текст урока «Статические конструкторы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.
Чему я научусь в уроке «Статические конструкторы»?
Инициализируйте статическое состояние ровно один раз. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Статические конструкторы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Определение конструкторов
- Цепочка конструкторов с this
- Инициализаторы объектов и коллекций
- Статические конструкторы