Что такое типизация переменных в C#?

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

Ответ

Типизация переменных в C# — это механизм, определяющий тип данных, который может храниться в переменной, и набор допустимых операций над ней. C# является статически типизированным языком: тип переменной проверяется на этапе компиляции и не может быть изменён во время выполнения.

Основные аспекты:

  • Безопасность: Компилятор предотвращает множество ошибок, проверяя соответствие типов (например, нельзя присвоить строку целочисленной переменной).
  • Производительность: Знание типов на этапе компиляции позволяет выполнять оптимизации.
  • Читаемость: Явное указание типа делает код более понятным.

Примеры объявления:

// Явная типизация
int count = 10;
string name = "Alice";
DateTime today = DateTime.Now;
List<int> numbers = new List<int>();

// Неявная типизация с помощью ключевого слова 'var'
// Компилятор сам выводиет тип на основе правого выражения
var inferredCount = 10;          // int
var inferredName = "Bob";        // string
var list = new List<string>();   // List<string>
// var error; // Ошибка: переменная var должна быть инициализирована

Важные нюансы использования var:

  • var — это не "динамический" или "слабый" тип. Это синтаксический сахар для явного типа, который компилятор определяет один раз и навсегда.
  • После определения как int, переменная не может стать string.
    var x = 5;   // x имеет тип int
    x = "text"; // ОШИБКА КОМПИЛЯЦИИ: нельзя неявно преобразовать string в int
  • var рекомендуется использовать, когда тип правой части выражения очевиден из контекста (например, при вызове конструктора new MyClass()), чтобы избежать избыточности кода.

Динамическая типизация (исключение): Ключевое слово dynamic позволяет обойти проверку типов на этапе компиляции, перенося её на этап выполнения (DLR). Используется редко, в основном для работы с COM-объектами или динамическими языками.

dynamic dynamicVar = 10;
dynamicVar = "Now I'm a string"; // Ошибки компиляции нет, но может привести к исключению во время выполнения.