ASP.NET MVC – C#4 – Dinamismo
   e argumentos opcionais e
          nomeados




               Giovanni Bassi
           ...
Online @

 Email: giggio@giggio.net
 Blog técnico: http://unplugged.giggio.net
 Site: http://giovannibassi.com

 .Net ...
Evento




    Palestras:
    Programando com prazer com Domain Driven Design (DDD)
    Utilizando Injeção de dependência ...
Agenda



                       Evolução do   Argumentos
         Ferramental
                           C#         opcio...
Ferramental

   • C# 4.0 (Visual C# 2010) está presente no Visual Studio
     2010 Beta 1 lançado em Maio

   • Download d...
Evolução C#




                                            C#4
                                   C#3      • Facilidade
 ...
C# e VB

   • Lado a Lado com VB

   • Sem separação de perfil de desenvolvedor
   (Mas não espere XML Literals no C# )
4 novidades

   • Construções dinâmicas

   • Argumentos opcionais e argumentos nomeados

   • Variância para tipos genéri...
4 novidades

   • Construções dinâmicas

   • Argumentos opcionais e argumentos nomeados

   • Variância para tipos genéri...
4 novidades

   • Construções dinâmicas

   • Argumentos opcionais e argumentos nomeados

   • Variância para tipos genéri...
Parametros opcionais
Esclarecendo

   • Argumentos opcionais
      – Permite omitir argumentos na chamada de uma função,
        usando valores...
Argumentos

  • Argumentos opcionais
  VB (criando o método):
  Public Class Elevador
      Public Sub Subir(Optional ByVa...
Argumentos

   • Chamada: como era antes?
     var elevador = new Elevador();
     elevador.Subir(1,1); //Obrigatório info...
Argumentos

   • Chamada: como é agora?
     var elevador = new Elevador();
     elevador.Subir();
Argumentos

   • Declaração: como era antes?
     public class ElevadorCS
     {
         public void Subir()
         {
 ...
Argumentos

   • Declaração: como é agora?
    public class ElevadorCS
    {
        public void Subir(int andares = 1,
  ...
Argumentos

   • Vantagens
      – Mais claro
      – Mais explícito
      – Mais simples


   • Desvantagens
      – Se m...
Argumentos

   • Regras
      – Parâmetros opcionais são os últimos do método
      public void Subir(int andares = 1,
   ...
Argumentos

   • Regras
      – Parâmetros opcionais são os últimos do método
      public void Subir(int andares = 1,
   ...
Argumentos

   • Regras
      – Parâmetros opcionais são os últimos do método
      public void Subir(int andares = 1,
   ...
Argumentos

   • Regras
      – Parâmetros opcionais são os últimos do método
      public void Subir(int andares = 1,
   ...
Parametros nomeados
Argumentos

   • Como era antes?

     var elevador2 = new ElevadorCS();
     elevador2.Subir(2, 3);
Argumentos

   • Como é agora?

     var elevador2 = new ElevadorCS();
     elevador2.Subir();
     elevador2.Subir(veloci...
Argumentos

   • Regras
      – Você pode nomear qualquer argumento, seja ele opcional
        ou não
      – Argumentos n...
Demo


             Demo



       Argumentos opcionais e
            nomeados
Dúvidas até aqui?
Dinamismo
C# Dinâmico

   • Motivação

      – Hype das linguagens dinâmicas




      – Produtividade

      – Testes

      – Inte...
C# Dinâmico

   • Entendendo a infra

      – Dynamic Language Runtime (DLR) agora é parte da BCL

      – Microsoft.CShar...
C# Dinâmico

   • Entendendo o dynamic

      – Tipos são “estáticamente tipados como dinâmicos”

      – Tipos dinâmicos ...
C# Dinâmico

   • Exemplos
     dynamic d;
     dynamic d = 3;
     object o = 3;
     d.QualquerCoisa(3);
     Console.Wr...
C# Dinâmico

   • Mais Exemplos
     var d2 = d.AlgumValor();
     var d3 = ObterVariavelDinamica();
Dispatch

   • Entendendo o Static Dispatch

      – É o comum até o C# 3.0

      – Ligação forte com o método sendo cham...
Demo


            Demo



   Static Dispatch no Reflector
Dispatch

   • Entendendo o Dynamic Dispatch

      – A resolução do método é feita em tempo de execução

      – Se for u...
Dispatch

   • Como o DLR encontra o método

      – Verifica o cache de chamadas, se houver, utiliza

      – Se o objeto...
Dispatch

   • Resolução de sobrecargas (overloads)

      – Mesma regra: se a chamada do método for dinâmica, o
        o...
Demo


            Demo



  Dinamic Dispatch no Reflector
Dispatch

  • Exemplo:

    public class Conversor
      {
        public void Converter(string x) { }
        public void...
Dispatch

  • Qual sobrecarga é chamada em cada caso?


    Conversor c1 = new SuperConversor();
    int i = 10;
    c1.Co...
Dispatch

  • Exemplo:

    public class Conversor
      {
        public void Converter(string x) { }
        public void...
Regra base 1




   A idéia é replicar o comportamento estático,
     como se as chamadas não fossem
     dinâmicas
Não funciona

   • Métodos de extensão

   • LINQ (depende de métodos de extensão)
Regra base 2


   Dynamic é um Object. Cuidado com Boxing
    e Unboxing.
          dynamic d = new AlgumaClasse();
      ...
Demo


        Demo



       C# Dinâmico
Revista
http://msdn.microsoft.com/en-us/vcsharp/dd819407.aspx (C# 4
Resources)

http://blogs.msdn.com/ericlippert/ (Eric Lippert -...
Dúvidas?
Online @

 Email: giggio@giggio.net
 Blog técnico: http://unplugged.giggio.net
 Site: http://giovannibassi.com

 .Net ...
Obrigado




       Giovanni Bassi
        giggio@giggio.net
blog: http://unplugged.giggio.net
Próximos SlideShares
Carregando em…5
×

C#4 - Parte 1 - Dinamismo E Argumentos opcionais e nomeados

2.357 visualizações

Publicada em

Apresentação do webcast MSDN sobre C# 4.
Parte 1
Apresentando C# dinamico e argumentos opcionais e nomeados

Publicada em: Tecnologia
  • Não tenho a opção de fazer o download dessa apresentação ??
    Abraços.
       Responder 
    Tem certeza que deseja  Sim  Não
    Insira sua mensagem aqui

C#4 - Parte 1 - Dinamismo E Argumentos opcionais e nomeados

  1. 1. ASP.NET MVC – C#4 – Dinamismo e argumentos opcionais e nomeados Giovanni Bassi giggio@giggio.net blog: http://unplugged.giggio.net
  2. 2. Online @ Email: giggio@giggio.net Blog técnico: http://unplugged.giggio.net Site: http://giovannibassi.com .Net Architects: Grupo: http://dotnetarchitects.net Online: http://tinyurl.com/DotNetArch
  3. 3. Evento Palestras: Programando com prazer com Domain Driven Design (DDD) Utilizando Injeção de dependência com Unity (Enterprise Library) ASP.Net MVC: tome seu HTML de volta ORM - Sendo preguiçoso com Nhibernate Testes: garantindo que seu código faz o que você quer Data: 27/Junho Local: Unip Tatuapé - São Paulo/SP Valor: R$ 50 http://dotnetarchitects.net/dnad2009
  4. 4. Agenda Evolução do Argumentos Ferramental C# opcionais Demo e 1ª C# Argumentos parada para Dinâmico nomeados perguntas 2ª parada Recursos e Demo para Links úteis perguntas
  5. 5. Ferramental • C# 4.0 (Visual C# 2010) está presente no Visual Studio 2010 Beta 1 lançado em Maio • Download do Beta tem apenas 1.3 GB, disponível em: – http://tinyurl.com/vs10b1 • Também no VS10: – VB X – F# – DLR (suporte para IronRuby, IronPython, etc...)
  6. 6. Evolução C# C#4 C#3 • Facilidade de uso • LINQ C#2 • Generics C#1 • Versão inicial
  7. 7. C# e VB • Lado a Lado com VB • Sem separação de perfil de desenvolvedor (Mas não espere XML Literals no C# )
  8. 8. 4 novidades • Construções dinâmicas • Argumentos opcionais e argumentos nomeados • Variância para tipos genéricos • Melhorias na interoperabilidade com o COM
  9. 9. 4 novidades • Construções dinâmicas • Argumentos opcionais e argumentos nomeados • Variância para tipos genéricos • Melhorias na interoperabilidade com o COM
  10. 10. 4 novidades • Construções dinâmicas • Argumentos opcionais e argumentos nomeados • Variância para tipos genéricos • Melhorias na interoperabilidade com o COM
  11. 11. Parametros opcionais
  12. 12. Esclarecendo • Argumentos opcionais – Permite omitir argumentos na chamada de uma função, usando valores padrão • Argumentos nomeados – Permite dizer os nomes dos argumentos em uma chamada de função • Igualzinho há no VB.Net desde o .Net 1.0 e VB 7 (2002)
  13. 13. Argumentos • Argumentos opcionais VB (criando o método): Public Class Elevador Public Sub Subir(Optional ByVal andares As Integer = 1,_ Optional ByVal velocidade As Integer = 1) End Sub End Class
  14. 14. Argumentos • Chamada: como era antes? var elevador = new Elevador(); elevador.Subir(1,1); //Obrigatório informar
  15. 15. Argumentos • Chamada: como é agora? var elevador = new Elevador(); elevador.Subir();
  16. 16. Argumentos • Declaração: como era antes? public class ElevadorCS { public void Subir() { this.Subir(1, 1); } public void Subir(int andares) { this.Subir(andares, 1); } public void Subir(int andares, int velocidade) { } }
  17. 17. Argumentos • Declaração: como é agora? public class ElevadorCS { public void Subir(int andares = 1, int velocidade = 1) { } }
  18. 18. Argumentos • Vantagens – Mais claro – Mais explícito – Mais simples • Desvantagens – Se mal usado pode incentivar métodos com parâmetros demais
  19. 19. Argumentos • Regras – Parâmetros opcionais são os últimos do método public void Subir(int andares = 1, int velocidade) {}
  20. 20. Argumentos • Regras – Parâmetros opcionais são os últimos do método public void Subir(int andares = 1, int velocidade) {}
  21. 21. Argumentos • Regras – Parâmetros opcionais são os últimos do método public void Subir(int andares = 1, int velocidade) {} – Somente constantes public void Subir(int andares, int velocidade = ObterVelocidade()) {}
  22. 22. Argumentos • Regras – Parâmetros opcionais são os últimos do método public void Subir(int andares = 1, int velocidade) {} – Somente constantes public void Subir(int andares, int velocidade = ObterVelocidade()) {}
  23. 23. Parametros nomeados
  24. 24. Argumentos • Como era antes? var elevador2 = new ElevadorCS(); elevador2.Subir(2, 3);
  25. 25. Argumentos • Como é agora? var elevador2 = new ElevadorCS(); elevador2.Subir(); elevador2.Subir(velocidade: 2); elevador2.Subir(velocidade: 2, andares: 3);
  26. 26. Argumentos • Regras – Você pode nomear qualquer argumento, seja ele opcional ou não – Argumentos nomeados podem ser chamados em qualquer ordem – As chamadas são feitas na ordem em que são declaradas do chamador, e não na função public void Subir( int andares = 1, int velocidade = 1) {} elevador2.Subir( Primeiro velocidade: this.ObterVelocidade(), Segundo andares: this.ObterAndares() );
  27. 27. Demo Demo Argumentos opcionais e nomeados
  28. 28. Dúvidas até aqui?
  29. 29. Dinamismo
  30. 30. C# Dinâmico • Motivação – Hype das linguagens dinâmicas – Produtividade – Testes – Interoperabilidade
  31. 31. C# Dinâmico • Entendendo a infra – Dynamic Language Runtime (DLR) agora é parte da BCL – Microsoft.CSharp é obrigatória para trabalhar com dynamic – Somente no .Net 4.0
  32. 32. C# Dinâmico • Entendendo o dynamic – Tipos são “estáticamente tipados como dinâmicos” – Tipos dinâmicos são System.Object’s – Tipos dinâmicos se propagam nas chamadas – Tipos dinâmicos não possuem checagem em tempo de compilação ou Intelisense
  33. 33. C# Dinâmico • Exemplos dynamic d; dynamic d = 3; object o = 3; d.QualquerCoisa(3); Console.Writeline(d[10]); d.Propriedade1 = d.Propriedade2; d += 1; var a = d + Datetime.Now(); d(quot;algum parâmetroquot;, 3);
  34. 34. C# Dinâmico • Mais Exemplos var d2 = d.AlgumValor(); var d3 = ObterVariavelDinamica();
  35. 35. Dispatch • Entendendo o Static Dispatch – É o comum até o C# 3.0 – Ligação forte com o método sendo chamado – Sem perda de performance
  36. 36. Demo Demo Static Dispatch no Reflector
  37. 37. Dispatch • Entendendo o Dynamic Dispatch – A resolução do método é feita em tempo de execução – Se for uma chamada sobre um tipo dinâmico (dynamic receiver), a chamada é dinâmica (ligada em runtime) – Se for uma chamada sobre um tipo e método estáticos (static receiver), mas houver um parâmetro dinâmico, também é uma chamada dinâmica (ligada em runtime)
  38. 38. Dispatch • Como o DLR encontra o método – Verifica o cache de chamadas, se houver, utiliza – Se o objeto for um IDynamicMetaObjectProvider, utiliza sua implementação – Se não for, utiliza o Binder do C#, no caso, com Reflection – Se não achar: RuntimeBinderException
  39. 39. Dispatch • Resolução de sobrecargas (overloads) – Mesma regra: se a chamada do método for dinâmica, o overload é avaliados somente em runtime – O DLR busca uma assinatura idêntica no cache – Se houver ele usa, senão ele busca uma converter os parâmetros, e achando, guarda no cache – Se não achar: RuntimeBinderException
  40. 40. Demo Demo Dinamic Dispatch no Reflector
  41. 41. Dispatch • Exemplo: public class Conversor { public void Converter(string x) { } public void Converter(decimal x) { } } public class SuperConversor : Conversor { public void Converter(int x) { } }
  42. 42. Dispatch • Qual sobrecarga é chamada em cada caso? Conversor c1 = new SuperConversor(); int i = 10; c1.Converter(i); Conversor c2 = new SuperConversor(); dynamic d1 = 10; c2.Converter(d1);
  43. 43. Dispatch • Exemplo: public class Conversor { public void Converter(string x) { } public void Converter(decimal x) { } } public class SuperConversor : Conversor { public void Converter(int x) { } }
  44. 44. Regra base 1 A idéia é replicar o comportamento estático, como se as chamadas não fossem dinâmicas
  45. 45. Não funciona • Métodos de extensão • LINQ (depende de métodos de extensão)
  46. 46. Regra base 2 Dynamic é um Object. Cuidado com Boxing e Unboxing. dynamic d = new AlgumaClasse(); d.s = default(S); S é uma struct d.s.i = 6; i é um campo inteiro da struct
  47. 47. Demo Demo C# Dinâmico
  48. 48. Revista
  49. 49. http://msdn.microsoft.com/en-us/vcsharp/dd819407.aspx (C# 4 Resources) http://blogs.msdn.com/ericlippert/ (Eric Lippert - Microsoft) http://blogs.msdn.com/samng/archive/tags/Runtime+binding/default .aspx (Sam NG - Microsoft) http://unplugged.giggio.net/unplugged/?tag=/c%234 (Giovanni Bassi - MVP) http://renatoguimaraes.spaces.live.com (Renato Guimarães – MVP)
  50. 50. Dúvidas?
  51. 51. Online @ Email: giggio@giggio.net Blog técnico: http://unplugged.giggio.net Site: http://giovannibassi.com .Net Architects: Grupo: http://dotnetarchitects.net Online: http://tinyurl.com/DotNetArch
  52. 52. Obrigado Giovanni Bassi giggio@giggio.net blog: http://unplugged.giggio.net

×