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
.
var
possível inferir tipos que podem não ser desejados devido a subtipos e conversões implícitas. Ou seja,var
pode ter resolvido um tipo estaticamente diferente do esperado quando ocorrem conversões implícitas (principalmente para um tipo mais geral, mas não se limita a isso). Um exemplo trivial éobject x = ""
vs.var x = ""
vs.var x = "" as object
, mas outros casos mais sorrateiros (e realistas) podem ocorrer e podem causar erros sutis.WriteLine
deve chamar. Essa "ligação" acontece em tempo de compilação. No caso dedynamic
, o tipo de.Length
também deve serdynamic
, e somente no tempo de execução é decidido qual sobrecarga (se houver alguma)WriteLine
se encaixa melhor. A ligação acontece em tempo de execução.var
palavra - chave no Visual Studio, o tipo real é exibido que está sendo inferido. Mostra que o tipo é conhecido em tempo de compilação.Variáveis declaradas com var são tipicamente implícitas, mas estaticamente . Variáveis declaradas com dinâmico são digitadas dinamicamente. Esse recurso foi adicionado ao CLR para oferecer suporte a linguagens dinâmicas como Ruby e Python.
Devo acrescentar que isso significa que as declarações dinâmicas são resolvidas em tempo de execução, as declarações var são resolvidas em tempo de compilação.
fonte
Vou explicar a diferença entre dinâmico e var .
Isso vai funcionar. O compilador pode recriar o tipo de variável dinâmica .
primeiro, ele cria o tipo como número inteiro e, depois disso, o compilador recriará o tipo como string,
mas no caso de var
fonte
var implica que a verificação de tipo estático (ligação antecipada) é aplicada. dynamic implica que a verificação dinâmica de tipo (ligação tardia) é aplicada. Em termos de código, considere o seguinte:
Se você compilar isso e inspecionar os resultados com o ILSpy, descobrirá que o compilador adicionou algum código de ligação tardia que manipulará a chamada para Hello () de b, enquanto que a ligação inicial foi aplicada a a, a poderá chamar Hello () diretamente.
por exemplo (desmontagem do ILSpy)
A melhor coisa que você pode fazer para descobrir a diferença é criar um pequeno aplicativo de console como este e testá-lo com o ILSpy.
fonte
Uma grande diferença - você pode ter um tipo de retorno dinâmico.
fonte
Aqui está um exemplo simples que demonstra a diferença entre Dynamic (4.0) e Var
Shiva Mamidi
fonte
**
caracteres no exemplo de código pretende indicar apenas ênfase e não faz parte do código de trabalho real.var
é apenas um atalho para uma declaração de tipo normal, na qual você deixa o compilador adivinhar o tipo correto.dynamic
é um novo tipo (estático), em que todas as verificações são feitas em tempo de execução, não pelo compilador.fonte
O tipo de uma variável declarada com var é determinado pelo compilador, é um atalho para especificar o nome do tipo, nada mais.
Por mais que a dinâmica seja determinada no tempo de execução, o compilador não tem idéia do tipo real e todos os acessos de método / campo / propriedade com essa variável serão trabalhados no tempo de execução.
fonte
Este é um bom vídeo do youtube que fala sobre o
var
VSDynamic
com demonstração prática.Abaixo está uma explicação mais detalhada com o instantâneo.
Var é vinculado antecipadamente (verificado estaticamente) enquanto dinâmico está atrasado (avaliado dinamicamente).
A palavra-chave var analisa seus dados do lado direito e, durante o tempo de compilação, decide o tipo de dados à esquerda. Em outras palavras, a palavra-chave var apenas poupa a digitação de muitas coisas. Dê uma olhada na imagem abaixo, onde, quando fornecemos dados de string e a variável x mostra o tipo de dados de string na minha dica de ferramenta.
Por outro lado, a palavra-chave dinâmica é para fins completamente diferentes. Objetos dinâmicos são avaliados durante o tempo de execução. Por exemplo, no código abaixo, a propriedade "Length" existe ou não é avaliada durante o tempo de execução. Digitei propositadamente um pequeno "l"; portanto, esse programa foi compilado corretamente, mas quando foi executado, gerou um erro quando a propriedade "length" foi chamado (SMALL "l").
fonte
A variável dinâmica e a variável var podem armazenar qualquer tipo de valor, mas é necessário inicializar 'var' no momento da declaração.
O compilador não possui nenhuma informação sobre o tipo de variável 'dinâmico'. var é seguro para o compilador, ou seja, o compilador tem todas as informações sobre o valor armazenado, para que não cause nenhum problema no tempo de execução.
O tipo dinâmico pode ser passado como argumento de função e a função também pode retorná-lo. O tipo Var não pode ser passado como argumento de função e a função não pode retornar o tipo de objeto. Esse tipo de variável pode funcionar no escopo em que foi definido.
No caso de transmissão dinâmica, não é necessário, mas você precisa conhecer as propriedades e métodos relacionados ao tipo armazenado, enquanto que para var Não há necessidade de transmissão porque o compilador possui todas as informações para executar a operação.
dynamic: útil ao codificar usando reflexão ou suporte de idioma dinâmico ou com os objetos COM, porque precisamos escrever menos quantidade de código.
var: Útil ao obter resultado das consultas linq. No framework 3.5, ele é apresentado para suportar o recurso linq.
Referência: Counsellingbyabhi
fonte
fonte
Não confunda dinâmico e var. Declarar uma variável local usando var é apenas um atalho sintático que faz o compilador inferir o tipo de dados específico de uma expressão. A palavra-chave var pode ser usada apenas para declarar variáveis locais dentro de um método, enquanto a palavra-chave dinâmica pode ser usada para variáveis, campos e argumentos locais. Você não pode converter uma expressão em var, mas pode converter uma expressão em dinâmico. Você deve inicializar explicitamente uma variável declarada usando var enquanto não precisar inicializar uma variável declarada com dinâmico.
fonte
Exemplo:
Mas no tipo Dinâmico, o tipo subjacente é determinado apenas no tempo de execução.O tipo de dados dinâmico não é verificado no tempo de compilação e também não é fortemente tipado.Podemos atribuir qualquer valor inicial para o tipo dinâmico e, em seguida, pode ser reatribuído a qualquer novo valor durante sua vida útil.
Exemplo:
Ele não fornece suporte ao IntelliSense e não oferece suporte melhor quando trabalhamos com o linq também, porque não suporta expressões lambda, métodos de extensão e métodos anônimos.
fonte
Aqui estão as diferenças
var é digitado estaticamente (tempo de compilação), dinâmico é digitado dinamicamente (tempo de execução)
Uma variável declarada como var pode ser usada apenas localmente, variáveis dinâmicas podem ser passadas como parâmetros para a função (a assinatura da função pode definir um parâmetro como dinâmico, mas não var).
com dinâmico, a resolução das propriedades acontece no tempo de execução e não é o caso de var, o que significa que, no momento da compilação, qualquer variável declarada como dinâmica pode chamar um método que pode ou não existir e, portanto, o compilador não gera um erro.
Digitar conversão com var não é possível, mas dinâmico é possível (você pode converter um objeto como dinâmico, mas não como var).
Arun Vijayraghavan
fonte