var
é digitado estático - o compilador e o tempo de execução sabem o tipo - eles apenas economizam sua digitação ... os seguintes são 100% idênticos:
var s = "abc";
Console.WriteLine(s.Length);
e
string s = "abc";
Console.WriteLine(s.Length);
Tudo o que aconteceu foi que o compilador descobriu que s
deve ser uma string (do inicializador). Nos dois casos, ele sabe (no IL) que s.Length
significa a string.Length
propriedade (instance) .
dynamic
é um animal muito diferente; é mais parecido com object
, mas com despacho dinâmico:
dynamic s = "abc";
Console.WriteLine(s.Length);
Aqui, s
é digitado como dinâmico . Ele não sabe sobre string.Length
, porque ele não sabe nada sobre s
em tempo de compilação. Por exemplo, o seguinte também seria compilado (mas não executado):
dynamic s = "abc";
Console.WriteLine(s.FlibbleBananaSnowball);
Em tempo de execução (apenas), ele verifica a FlibbleBananaSnowball
propriedade - falha em encontrá-la e explode em uma chuva de faíscas.
Com dynamic
, propriedades / métodos / operadores / etc são resolvidos em tempo de execução , com base no objeto real. Muito útil para conversar com o COM (que pode ter propriedades apenas de tempo de execução), o DLR ou outros sistemas dinâmicos, como javascript
.