sexta-feira, abril 20, 2012

C# - var vs dynamic

Muita coisa há a dizer à cerca do tipo var e do tipo dynamic, mas vou restringir-me a distingui-los pois vejo muitas pessoas a fazerem confusões entre os 2 tipos quando nada têm a ver um com o outro.

O tipo var é uma instância de um tipo qualquer, frequentemente usado na instanciação de tipos anónimos esta é a sua principal utilização. Tudo o que sejam inicializações de variáveis implícitas só porque sim considero um mau hábito (ex: var i=3 deveria ser escrito int i=3, não existe necessidade de ter uma variável implícita).

No caso dos tipos anónimos o mais importante é que apesar de anónimos eles são fortemente tipados, o que parece um contrassenso, mas veja-se o seguinte código:
var anonymousObj = new { Id = 2, Name = "test" };
Olhando para a variável anonymousObj tanto eu como o compilador sabemos exactamente os campos que compõem aquele objecto, isto significa que eu vou ter erros em compile time.

Já no que toca a um tipo dynamic o comportamento é totalmente diferente, nem eu nem o compilador sabemos nada em concreto do objecto, logo todos os erros serão em run time. Com isto quero dizer que o compilador ignora qualquer tipo validações sobre aquele objecto e consequentemente deixa de nos disponibilizar a ajuda do IntelliSense.

Uma das utilizações possíveis para o dynamic é a deserialização de json. Se eu não quiser criar um tipo novo só para deserializar então eu deserializo para um objecto do tipo dynamic.
JavaScriptSerializer serializer = new JavaScriptSerializer();
//json é uma variável que terá a string de json
dynamic obj = serializer.Deserialize < object >(json);
string name = obj["name"];
Com esta utilização eu tenho de ter a certeza que no json me virá uma propriedade chamada name, caso contrário irei ter o tal erro em run time.

Sem comentários: