Linux / PHP / Java / Designer

As melhores dicas estão aqui.

[C#] object , var e dynamic qual a diferença ?

| 0 comentários

- object e dynamic : são tipos;
- var :  é uma forma de inferir um tipo e somente variáveis podem ser declaradas;
-  object e var :  toda a informação do tipo/variável é conhecida em tempo de compilação;
- dynamic : a informação é conhecida somente em tempo de execução e pode ser aplicado a propriedades, retorno de métodos, parâmetros, objetos enfim a TUDO.
- object e var : são palavras reservadas enquanto que dynamic não é. Dessa forma se você definir uma variável chamada dynamic ela será compilada no C# 4.0.

Object

Refere-se ao tipo System.Object que é a base para todos os outros tipos, sejam eles tipos-referência ou tipo-valor.

Uma variável/parâmetro desse tipo permite que se associe qualquer tipo de dados, sendo que se for uma classe, ocorre uma atribuição simples, e se for um tipo-valor, ocorre primeiro o boxing desse valor, e depois uma atribuição.

object x = 1; // vai ocorrer boxing do valor 1, pois Int32 é um value-type
object y = "str"; // não vai haver boxing, pois String é uma reference-type
// nullable é value-type, mas nunca será boxed dentro de um object
int? i = null;
int? j = 10;
object z1 = i; // z1 será null
object z2 = j; // z2 terá um Int32 com o valor 10 boxed e atribuido à variável

var

Isso é o que se chama de açucar-sintático. É só uma palavra chave que é usada para que o compilador adivinhe o tipo na hora de compilar. Isso se chama inferência de tipo. Vou ser direto:

var x = 1;
var y = "str";
var z = x == 2 ? new MeuObjeto("xpto") : new MeuObject("abc");

será traduzido pelo compilador para:
Int32 x = 1;
String y = "str";
MeuObjeto z = x == 2 ? new MeuObjeto("xpto") : new MeuObject("abc");

Dynamic

Essa é uma palavra chave que permite chamar métodos e propriedades de um objeto qualquer, sem conhecer o seu tipo. Isso é conhecido como late-binding, ou seja, é associar a chamada ao método/propriedade de destino somente no momento em que a chamada for feita.

Note que, ao fazer o dispatch, será usado um dispatcher que age exatamente como o C# (ou o Visual Basic, se estiver usando dynamic no VB). Esse dispatcher tenta localizar o método/propriedade/operação da mesma forma que o C# faria... e se falhar será lançada uma exceção indicando que a chamada não poderá ser feita.

Procure saber mais sobre duck-typing, pois o conceito é muito semelhante... senão o mesmo.

 

 

Deixe uma resposta

Campos requeridos estão marcados *.