Estive recentemente estudando mais sobre os tipos dinâmicos em c #. Com alguns exemplos que entendi quando o código é compilado, ele não precisa ser recompilado novamente, mas pode ser executado diretamente.
Sinto que a flexibilidade fornecida pela palavra-chave para realmente alterar o tipo de dados à vontade é uma grande vantagem .
Questão,
Existem deficiências específicas, além das chamadas de método dinâmico erradas, que lançam exceções de tempo de execução que os desenvolvedores devem conhecer antes de iniciar a implementação.
c#
.net
visual-studio-2010
Karthik Sreenivasan
fonte
fonte
object
ou conversão direta do tipo um cheiro de código. Em quase todos os casos, isso significava que eu ou um membro da nossa equipe não havia projetado uma interface apropriada para essa funcionalidade. Eu estou supondo que, se eu estivesse usando o C # 4 agora, também me sentiria da mesma maneira sobre o uso dodynamic
. Eu poderia ver o caso, se você tornar tudo dinâmico, mas nesse caso você também pode ter selecionado um idioma de tipo dinâmico. * 8 ')dynamic
em C # significa que você não precisa abandonar o IronPython se tudo o que você precisa é de digitação dinâmica para uma pequena parte do seu código. Para um avaliador de expressão, tive grande sucesso usandodynamic
para representar os operandos de uma expressão e os resultados da avaliação.dynamic
, além disso, eu gostaria de saber sobre o IronPython quando estava desenvolvendo com o .Net - isso poderia ter tornado muito mais fácil certas coisas que estávamos tentando fazer .Respostas:
A principal falha é que você joga fora uma das principais propriedades (não necessariamente vantagens) do C # - que é estaticamente tipada (e na maior parte do tipo é segura).
O problema com a digitação dinâmica é que muitas vezes oculta erros que seriam revelados durante a compilação. Esse bug se manifesta apenas no tempo de execução, o que, obviamente, dificulta a detecção.
Existem muito poucas razões para usar a digitação dinâmica em C # da IMO, a principal delas é a colaboração com linguagens de tipo dinâmico (que é AFAIK, a razão pela qual a dinâmica foi introduzida em primeiro lugar).
Se você deseja fazer uma programação totalmente dinâmica, digite alguma linguagem projetada para ser dinâmica, e não faça com que o C # seja dinâmico. Você pode usar, por exemplo, o IronPython, se quiser usar as bibliotecas .Net
fonte
dynamic
lhe dá é a capacidade de converter um objeto para o seu tipo real sem nenhum tipo de invasão de reflexão. Por exemplo, seBase foo = new Derived();
e havia dois métodos sobrecarregadosMoo(Base x)
eMoo(Derived x)
, em seguida ,Moo(foo)
chamaMoo(Base x)
, masMoo((dynamic)foo)
chamaMoo(Derived x)
. Isso leva a uma implementação muito elegante do padrão Visitor, por exemplo: code.logos.com/blog/2010/03/… e, em geral, é uma técnica muito poderosa.Não tenho certeza de que tipo de deficiências você está procurando, mas se quiser saber sobre os recursos que funcionam com a digitação estática, mas não com
dynamic
, existem alguns:Métodos de extensões não funcionam. Este é provavelmente o maior. Se você tiver
dynamic collection
, não poderá usar código comocollection.Distinct()
. Isso ocorre porque os métodos de extensão disponíveis dependem do espaço para nomeusing
o DLR não tem como conhecê-los.Como solução alternativa, você pode chamar o método como se fosse método estático normal:
Enumerable.Distinct(collection)
. Ou você pode alterar o tipo da coleção para algo comoIEnumerable<dynamic>
.foreach
requerIEnumerable
. Em C # normal,foreach
é baseado em padrões. Ou seja, não requer nenhuma interface específica, apenas umGetEnumerator()
método que retorna um objeto adequado. Se você usarforeach
emdynamic
, a implementação deIEnumerable
é necessário. Mas como o motivo desse comportamento é que o C # 1.0 não tinha genéricos, essa "falha" é praticamente irrelevante.fonte
O problema com os tipos dinâmicos (não variáveis declaradas como dinâmicas) no .net é que eles não têm muita funcionalidade disponível para os tipos estáticos.
Portanto, não escreva código com tipos dinâmicos, a menos que você saiba o que está fazendo.
fonte
Uma vez que
dynamic
é apenas uma marcaobject
ele tipos de valor.Isso pode ter implicações no desempenho, mas como eu usaria a digitação estática no código crítico de desempenho, isso provavelmente não é um problema na prática.
Esse boxe também interfere nos tipos de valores mutáveis. Se você modificá-los com
dynamic
, modifique apenas a cópia em caixa. Mas como você não deve usar tipos de valores mutáveis em primeiro lugar, isso também não é um grande problema.fonte