Разница между динамическим и System.Object - PullRequest
11 голосов
/ 12 августа 2010

В чем разница между переменной, объявленной как динамическая, и переменной, объявленной как System.Object? Запуск следующей функции может показывать, что обе переменные динамически приводятся к правильному типу:

void ObjectTest()
{
    System.Object MyTestVar = "test";
    dynamic MyTestVar2 = "Testing 123";

    Console.WriteLine("{0}", MyTestVar.GetType());
    Console.WriteLine("{0}", MyTestVar2.GetType());

    MyTestVar = 123;
    MyTestVar2 = 321;

    Console.WriteLine("{0}", MyTestVar.GetType());
    Console.WriteLine("{0}", MyTestVar2.GetType());
}

Ответы [ 4 ]

10 голосов
/ 12 августа 2010

Разница в том, что MyTestVar2.ToUpper() компилируется и работает без явного приведения.

object - это обычный тип.
dynamic - это тип заполнителя, который заставляет компиляторгенерировать динамические вызовы с поздним связыванием.

GetType() - это нормальная функция, определяемая классом object, который работает с экземпляром , для которого вы ее вызываете.
GetType()совершенно не зависит от объявленного типа переменной, которая ссылается на объект, который вы вызываете.(кроме обнуляемых)

3 голосов
/ 05 октября 2010

Принципиальная разница: время компиляции (для объекта) и время выполнения (для динамического) разрешение вызовов.Его также называют ранним или поздним связыванием.[Примечание: добавьте ссылку на Microsoft.CSharp для следующего кода для компиляции.]

   object o = "Hello world";// fine because a derived type can be assigned to a base type
   dynamic d= "Hello world";// fine as well  

   Type otype=o.GetType();// compiles because it confirms that object has a GetType()
   Type dtype=d.GetType();// also compiles but for another reason (i.e.no binding yet)

   string upperd= d.ToUpper(); // compiles because no binding yet ( anything goes :)
   string uppero= o.ToUpper(); // Fails to compile. Object has no ToUpper() method 

Если вы закомментируете последний вызов, приложение должно работать нормально, поскольку CLR, когда оно достигает второго последнеговызовите d.ToUpper () во время выполнения, он будет искать метод ToUpper () в строковом типе и найдет его там (потому что во втором выражении d была назначена строка).Последний вызов не скомпилирован, потому что ToUpper () ищется в типе System.Object во время компиляции, которого, конечно, там не будет.

3 голосов
/ 12 августа 2010

Возможно, вам стоит начать с этой превосходной статьи MSDN .Различия можно суммировать довольно кратко:

Во время компиляции предполагается, что элемент, который напечатан как динамический, поддерживает любую операцию.

System.Object имеет тольконесколько операций, которые он поддерживает - ToString(), Equals() и т. д.

0 голосов
/ 09 марта 2019

Единственная разница между объектом и динамикой.

В случае объекта вам необходимо явное приведение типа, когда вы собираетесь получить значение из объекта.

Пожалуйста, дайте подобное, если вы считаете это подходящим.

...