В чем разница между dynamic, var и object в C#?

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

Ответ

Ключевое различие между dynamic, var и object заключается в времени проверки типов и необходимости приведения.

  • var — вывод типа на этапе компиляции (compile-time). Это не тип, а указание компилятору самому определить и подставить статический тип на основе выражения инициализации. После определения тип фиксируется.

    var number = 10;        // Компилятор определяет тип как `int`
    // number = "text";    // ОШИБКА КОМПИЛЯЦИИ: нельзя присвоить string переменной типа int
  • dynamic — обход проверки типов на этапе компиляции. Тип и операции проверяются только во время выполнения (runtime). Это может привести к исключениям RuntimeBinderException, если операция недопустима.

    dynamic value = 10;
    value = "text";        // OK, тип меняется
    int length = value.Length; // OK на этапе компиляции, но упадет в runtime, т.к. у int нет свойства Length
  • object — корневой тип системы. Все типы наследуются от object. Для работы с конкретным типом требуется явное приведение (упаковка/распаковка для значимых типов).

    object obj = 10;        // Упаковка (boxing): int -> object
    int num = (int)obj;     // Распаковка (unboxing): object -> int (требуется явное приведение)
    // string str = (string)obj; // InvalidCastException в runtime
Сводная таблица: Ключевое слово Проверка типа Безопасность Приведение Основное назначение
var Компиляция (статическая) Высокая Не требуется Упрощение синтаксиса, LINQ-запросы
dynamic Выполнение (динамическая) Низкая Не требуется Работа с COM, динамическими языками (Python), отражение
object Компиляция (к object) Средняя Требуется явное Общие контейнеры, полиморфные коллекции

Практическое правило: Используйте var для локальных переменных, когда тип очевиден из правой части. Используйте dynamic только при необходимости взаимодействия с динамическими системами, осознавая риски. Используйте object, когда нужна общая ссылка на данные неизвестного заранее типа.