В C#: объект, var и динамика есть 3 "общих" типа (хотя не все являются реальными типами).
Объект
Фактический тип, как и любой другой тип, с одним специальным правилом: если тип не наследует, он наследует от объекта. Из этого следует, что все типов наследуют от объект, прямо или косвенно.
Адрес: объект тип. Объект может иметь тип объект, а тип имеет свои методы, такие как ToString(). Поскольку все наследуется от объекта, все может быть upcast в объект. При назначении объекта в качестве объекта ссылки, вы делаете так же, как приведение к базовому типу, когда вы назначаете слона объект типа к животным ссылки, где слон наследуется от животных.
SomeType x = new SomeType();
object obj = x;
obj.DoSomething();
- OBJ трактуется как тип объекта во время компиляции, и будет иметь тип объекта во время выполнения (что логично, поскольку он является фактический тип - OBJ объявлен как объект так может быть только этого типа)
- obj.DoSomething() вызовет ошибку во время компиляции, так как Ob ject не имеет этого метода, независимо от того, имеет ли его тип SomeType.
Var
Это не фактический тип, это просто сокращение для «компилятора, выяснить тип для меня, основываясь на правой стороне уступка».
SomeType x = new SomeType();
var obj = x;
obj.DoSomething();
- OBJ рассматривается как тип SomeType во время компиляции, и будет типа SomeType во время выполнения, так же, как если бы вы написали «SomeType» вместо «вар» ,
- если SomeType имеет метод DoSomething(), этот код будет работать
- если SomeType не имеет метода, то код будет вызывать ошибку времени компиляции
Динамический
Это тип, который сообщает компилятору отключить проверку типа компиляции по переменной. Объект рассматривается как имеющий тип динамический во время компиляции и времени выполнения.
SomeType x = new SomeType();
dynamic obj = x;
obj.DoSomething();
- OBJ имеет тип динамического во время компиляции и время выполнения
- если SomeType имеет метод DoSomething(), этот код будет работать
- если SomeType Безразлично» t, этот метод будет компилироваться, но генерирует исключение во время выполнения
нет е, что динамический может вызвать исключения очень легко, если использовать небрежно:
public void f(dynamic x)
{
x.DoSomething();
}
Это будет сгенерировано исключение, если х относится к типу, который не имеет в метод DoSomething, но все равно можно будет вызвать его и передать любой объект в качестве параметра без ошибки времени компиляции, вызывая ошибку, которая проявляется только во время выполнения и, возможно, только в определенных обстоятельствах - потенциальная ошибка. Поэтому, если вы используете динамику в любом виде открытого интерфейса класса, вы всегда должны вручную вводить проверку во время выполнения с использованием рефлексии, тщательно разбираться с исключениями или не делать этого в первую очередь.
Примечание: объект, на который ссылается, никогда не изменяет его тип, конечно. В то время как obj может быть объект, x, что он относится к прежнему SomeType.
Почему вам нужно хранить гетерогенные объекты в одном списке? Просто любопытно ... –
вам следует искать динамический объект vs, проверить этот поток, он, вероятно, отвечает на ваш ответ http://stackoverflow.com/questions/3442821/dynamic-vs-object-type – Habib
У меня есть класс, где один свойств - это набор элементов, относящихся к этому классу, которые не являются одним и тем же типом, но имеют значение как группа. – Jason