Что происходит, когда объявляется переменная в C#?

«Что происходит, когда объявляется переменная в C#?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Объявление переменной (Type name;) резервирует область памяти для хранения значения этого типа. Конкретные действия зависят от контекста объявления и категории типа (значимый или ссылочный).

1. Локальные переменные (внутри метода)

  • Для значимых типов (int, double, struct): Компилятор резервирует память непосредственно в кадре стека текущего метода. Переменная должна быть явно инициализирована перед чтением.
    int number; // Память под 4 байта зарезервирована в стеке.
    // Console.WriteLine(number); // Ошибка компиляции: использование неинициализированной переменной.
    number = 42; // Инициализация.
  • Для ссылочных типов (class): В стеке резервируется память под ссылку (указатель). По умолчанию она имеет значение null. Память под сам объект выделяется только при использовании оператора new.
    string text; // В стеке зарезервировано место для ссылки. text == null.
    text = "Hello"; // Ссылка теперь указывает на объект строки в куче.

2. Поля экземпляра класса

  • Память выделяется как часть памяти объекта, когда создается экземпляр класса (через new).
  • Значимые типы инициализируются значением по умолчанию (0, false).
  • Ссылочные типы инициализируются в null.
    public class MyClass
    {
        public int Id;       // Будет 0 при создании MyClass
        public string Name;  // Будет null при создании MyClass
    }

3. Статические переменные (поля класса)

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

Итог: Объявление — это инструкция компилятору о намерении использовать переменную. Фактическое выделение памяти происходит в момент, определенный контекстом (при входе в метод, при создании объекта и т.д.).