A nova palavra -chave 'dinâmica' c# 4.0 deprecia a palavra -chave 'var'?
-
08-07-2019 - |
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
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á.