Pergunta

Quando C# 4.0 sai e temos a palavra -chave dinâmica, conforme descrito neste Excelente apresentação de Anders Hejlsberg, (C# está evoluindo mais rápido do que posso acompanhar. Não tive muito tempo para me familiarizar com a palavra -chave Var)

Eu ainda precisaria da palavra -chave var? Existe algo que o VAR pode fazer .. essa dinâmica não pode?

var x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x

dynamic x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x
Foi útil?

Solução

Não, eles são muito diferentes.

var significa "inferir o tipo de variável em tempo de compilação" - mas ainda está totalmente vinculado estaticamente.

dynamic significa "suponha que eu possa fazer o que eu quiser com essa variável" - ou seja, o compilador não sabe quais operações estão disponíveis e o DLR vai descobrir o que as chamadas verdade média em tempo de execução.

Eu espero usar dynamic Muito raramente - somente quando eu realmente quero um comportamento dinâmico:

  • var Permite pegar erros de digitação etc. no tempo de compilação
  • O código estaticamente ligado sempre será executado mais rápido do que o código dinamicamente ligado (mesmo que a diferença se torne razoavelmente pequena)
  • Código estaticamente ligado fornece mais suporte ao tempo de compilação além de apenas erros: você pode encontrar hierarquias de chamadas, a refatoração funcionará melhor, o Intellisense está disponível etc.

Outras dicas

Dinâmico e Var representam duas idéias completamente diferentes.

var

O Var pede essencialmente ao compilador que descubra o tipo de variável com base na expressão no lado direito da instrução de atribuição. A variável é então tratada exatamente como se fosse explicitamente declarada como o tipo de expressão. Por exemplo, as duas declarações a seguir são equivalentes

var a = "foo";
string a = "foo";

A chave a ser retirada aqui é que "var" é 100% do tipo seguro e é uma operação de tempo de compilação

dinâmico

A dinâmica é, de muitas maneiras, exatamente o oposto de var. Usar dinâmico está essencialmente eliminando todo o tipo de segurança para a variável específica. Muitas maneiras pelas quais não tem tipo. Quando você chama um método ou campo na variável, a determinação de como invocar esse campo ocorre em tempo de execução. Por exemplo

dynamic d = SomeOperation();
d.Foo(); // Will this fail or not?  Won't know until you run the program

A chave a ser retirada aqui é que "dinâmico" não é do tipo seguro e é uma operação de tempo de execução

Sim, você ainda precisará do Var:

Var é um variável cujo tipo será inferido pelo compilador.
dinâmico terá seu tipo atribuído em tempo de execução

Então:

Var i = "Hello World"

terá seu tipo inferido como um tipo de string ao fazer isso, a intellisência lhe dará todos os métodos que a string pode usar como,

i.Split("/")

Enquanto:

dynamic i = "Hello World"

Não terá seu tipo de inferido até o tempo de execução, porque o complier não sabe que tipo ainda é, mas ainda permitirá que você faça:

i.Split("/")

Mas quando chama o método de que você precisa, pode falhar porque o tipo está errado e o método não está lá.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top