В этой статье рассмотрим типы dynamic, var, object в языке C# и поймём разницу между ними.
Тип var.
var — тип данных, который позволяет объявить переменную, тип значения которой пока неизвестен. Например:
Здесь мы создали переменную number без типа и задали ей значение 1, и эта переменная автоматически получила тип int. Вместо int можно было выбрать любой другой тип для var:
Здесь мы снова создали переменную number без типа и добавили значение с типом string.
Но обратите внимание, что после того, как мы зададим переменной типа var значение, тип этой переменной поменяется на тип полученного значения. То есть, если мы зададим переменной var значение типа string, то эта переменная станет string, и мы не сможем выполнять операции, например, int, для этой переменной типа string:
var test = "один"; // задали переменной без типа строку, теперь переменная test имеет тип string
test = 1; // мы больше не сможем так сделать, ибо переменная test имеет тип string, а 1 это тип int
Тип object.
Почти все типы в C# являются производными от типа object. Это можно назвать универсальным типом, в котором можно хранить любой тип значений когда угодно. То есть, в отличии от var, в object можно передать любой тип переменной даже после того, как мы уже задали для него значение. Пример:
object test; // объявили пустую переменную с типом object
test = 1; // задали переменной test значение с типом int
test = "один"; // поменяли значение переменной test на значение с типом string
Тип dynamic
dynamic тоже, как и object, может когда угодно принимать значения любых типов (хотя в отличии от object не является производным для большей части типов). То есть, мы можем сделать то же самое, что и в примере выше, только используя dynamic:
dynamic test; // объявили пустую переменную с типом dynamic
test = 1; // задали переменной test значение с типом int
test = "один"; // поменяли значение переменной test на значение с типом string
Но при этом есть несколько различий. Например, с переменной типа dynamic мы можем выполнять операции:
dynamic numberOne = 1;
object numberTwo = 2;
numberOne++; // эта переменная типа dynamic воспринимается компилятором как int, и операция произойдет
numberTwo++; // здесь мы получим ошибку, потому что использовать операцию ++ нельзя для типа object
Разница между типами
Из статьи мы узнали, что все три типа могут хранить разные типы значений, но есть разница. var, в отличии от dynamic и object, меняет свой тип только при первом присваивании: задав переменной значение типа int, эта переменная после этого всегда будет типа int. А dynamic, в отличии от object, может выполнять операции, присущие определенным типам. То есть если, например, переменные dynamic и object имеют значения int, то с dynamic мы можем выполнить операцию ++, а с object — нет.