Quem gostou de ver o dinamismo trazido ao C# 4.0 vai gostar de ficar sabendo que ainda há alguns problemas na implementação não resolvidos pela Microsoft (quem não viu ainda eu já demonstrei o C# 4.0 dinâmico aqui no blog).

(Estou puxando do blog do Sam Ng. Se você prefere ler no original eu encorajo que o faça.)

Abaixo vou demonstrar alguns dos problemas atuais a serem resolvidos até o lançamento do C# 4.0 com relação ao dinamismo. São construções que no C# estático não chegam a causar a menor preocupação, mas no C# dinâmico trazem algumas rugas.

 

Alteração de valores em tipos dinâmicos:

Por causa de boxing e unboxing, e como todo tipo dinâmico é um objeto, esse tipo de operação:

static void Main()
{
    dynamic d = 10;
    d++;
}

Vai resultar em "d" com um valor igual a 10, e não 11. O valor é unboxed, alterado e não é trazido de volta. Já viu o bug no seu código, né? Isso é altamente contra-intuitivo.

Além disso, no CTP atual isso não funciona. Vejam o erro:

Dinamismo no C# pode ser um perigo

 

Alteração aninhada em tipos de valor:

O código a seguir também vai te enganar.

public struct S
{
    public int i;
}

public class D
{
    public S s;
    public static void Main()
    {
        dynamic d = new D();
        d.s = default(S);
        d.s.i = 10;
        Console.WriteLine(d.s.i);
    }
}

O valor escrito na console parece ser 10, mas na verdade é zero. Mesmo problema do item anterior, o valor de S é unboxed, e a variável "i" alterada na verdade é do objeto que foi unboxed, ou seja, o valor d.s.i ainda é zero. Maus um pau no seu código.

 

Nível de acesso dos membros:

Esse método vai falhar só porque é dinâmico:

public class C
{
    private void M(int x) { }

    static void Main()
    {
        dynamic d = 10;
        C c = new C();
        c.M(d);
    }
}

Se a variável "d" fosse um inteiro ele funcionaria. Ele falha porque, como d é uma variável dinâmica, a chamada a c.M é feita dinamicamente. Isso significa que em runtime o método M vai ser procurado e advinhem? como ele é privado não vai ser encontrado. Algo trivial ficou complicado. Resultado: bug, bug, bug. Na prática, o código nem compila.

Além disso, há outros problemas:

  1. Não é possível fazer chamadas em métodos que implementam interfaces explicitamente. Isso acontece porque o método é exposto somente via interface, e na classe que a implementa ele fica "escondido". Como uma chamada dinâmica depende da visibilidade do método, chamadas a métodos que implementam interfaces explicitamente vão resultar em métodos não encontrados, ou, em outras palavras: bugs.
  2. Não é possível chamar métodos de classe base com parâmetros dinâmicos, porque em runtime o método é chamado dinamicamente, e sempre vai resolver para a classe filha.

Tudo parecia tão simples, não é? É sempre bom lembrar que quando se trata de linguagens e compiladores nada é óbvio. A Microsoft vai resolver os problemas, só não sabemos ainda como. De qualquer forma fiquem atentos porque independentemente da forma que for escolhida para resolver esses casos, você vai ter que entender o que está acontecendo. E o resultado pode ser tudo, menos trivial. E se você não souber o que está acontecendo já viu: bug, bug, bug.

Minha sugestão? Testes unitários! Pelo menos se você não entender o que está acontecendo o teste vai te mostrar onde os bugs estão.


Postado na(s) categoria(s) .Net pelo giovanni bassi em 23 de dezembro de 2008 às 12:23 | Tags:

Comentários


dezembro 23. 2008 14:39
Juliano Oliveira
Nuss, quanta bagunça no que era tão bom.
Eu particularmente ainda não gostei desse "dynamic". Achei tosco. Achei um BAITA POG. Querer fazer o que é estático virar dinâmico. Isso é um choque de paradigmas. Não achei nada legal isso.

Quer algo dinâmico? Parte pra um Ruby, VB ou mesmo aquele F#. Agora ficar mexendo no C# ??? Será que não estão "reinventando a roda" ???

A plataforma .NET é muito boa para ficarem "futucando" nisso. Acho que é bem melhor se eles invensentivassem a desenvolver aplicações com liguagens convergegindo na mesma solução.

Tu acha interessantes esse dymanic Giovanni?

http://programandoem.net/http://programandoem.net/


dezembro 23. 2008 16:41
Giovanni Bassi
Juliano, eu estou gostando bastante. É opcional, você só usa se quiser. A simplificação na integração com o COM, com o Javascript, com o Silverlight... não há nada parecido. A Microsoft está criando uma plataforma completíssima. Está ficando complexa, mas fazer o que? Tem que estudar, certo?

http://unplugged.giggio.net/http://unplugged.giggio.net/


Brazil Bruno Frank Cordeiro
julho 6. 2009 01:35
Bruno Frank Cordeiro
Cará você não gostou porque não sabe o poder que isso traz para a linguagem, e aproveitando a deixa, dynamic na verdade não é nenhuma novidade, pra você ter uma ideia SmallTalk ja tinha dynamic, e até nosso amigo Action Script tem, é muito interessante para fazer certas coisas.

no site


julho 23. 2009 12:08
Maurice Lacroix
I like how you write.Are you interesting in a part time writer job?

http://discountwatchshop.biz/http://discountwatchshop.biz/


dezembro 24. 2009 00:32
pingback
Pingback from unplugged.giggio.net

Rodando Ruby com C#: Parte 1

http://unplugged.giggio.net/unplugged/post/Rodando-Ruby-com-C-Parte-1.aspxhttp://unplugged.giggio.net/unplugged/post/Rodando-Ruby-com-C-Parte-1.aspx

Comentar


(Vai mostrar seu Gravatar)

  Country flag

biuquote
  • Comentário
  • Pré-visualização
Loading



Quem é Giovanni Bassi

Giovanni Bassi Sou uma pessoa apaixonada por tecnologia e especificamente por .Net. Sou consultor independente especialista em .Net, focado em arquitetura e melhores práticas. Tenho dezenas de artigos publicados na .Net Magazine, revista da qual sou editor técnico. Ministro palestras e cursos de vez em quando, e quando dá tempo eu respiro um pouco. Mais detalhes nesta página.

Busca

Selos

Eu vou ao TechEd Brasil 2010, e você?

MVP

MCPD

MCSD

.Net Magazine

Abaixo ao if!

Calendário

«  setembro 2010  »
seteququsedo
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910
Ver detalhamento de posts no calendário

Blogs interessantes

    OPMLDownload OPML file

    Postagens recentes

    Comentários recentes

    Disclaimer / Aviso
    As opiniões colocadas neste blog são minhas e pessoais e não expressam necessariamente as opiniões de meus empregadores, pareceiros e amigos. Da mesma forma, os comentários feitos por leitores do blog não expressam a minha opinião.

    © Copyright 2010 .Net Unplugged
    Log in