0Pricing
C# Academy · Урок

Статические конструкторы

Инициализируйте статическое состояние ровно один раз.

«Статические конструкторы» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Определение конструкторов
  2. Цепочка конструкторов с this
  3. Инициализаторы объектов и коллекций
  4. Статические конструкторы
← Назад к C# Academy