SlideShare uma empresa Scribd logo
1 de 52
ASP.NET MVC – C#4 – Dinamismo
   e argumentos opcionais e
          nomeados




               Giovanni Bassi
                giggio@giggio.net
        blog: http://unplugged.giggio.net
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
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
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
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...)
Evolução C#




                                            C#4
                                   C#3      • Facilidade
                                              de uso
                                   • LINQ
                      C#2
                      • Generics


          C#1
          • Versão
            inicial
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éricos

   • Melhorias na interoperabilidade com o COM
4 novidades

   • Construções dinâmicas

   • Argumentos opcionais e argumentos nomeados

   • Variância para tipos genéricos

   • Melhorias na interoperabilidade com o COM
4 novidades

   • Construções dinâmicas

   • Argumentos opcionais e argumentos nomeados

   • Variância para tipos genéricos

   • Melhorias na interoperabilidade com o COM
Parametros opcionais
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)
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
Argumentos

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

   • Chamada: como é agora?
     var elevador = new Elevador();
     elevador.Subir();
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)
         {
         }
     }
Argumentos

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

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


   • Desvantagens
      – Se mal usado pode incentivar métodos com parâmetros
        demais
Argumentos

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

   • Regras
      – Parâmetros opcionais são os últimos do método
      public void Subir(int andares = 1,
                        int velocidade)
      {}
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())
      {}
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())
      {}
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(velocidade: 2);
     elevador2.Subir(velocidade: 2, andares: 3);
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()
                        );
Demo


             Demo



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

   • Motivação

      – Hype das linguagens dinâmicas




      – Produtividade

      – Testes

      – Interoperabilidade
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
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
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);
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 chamado

      – Sem perda de performance
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 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)
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
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
Demo


            Demo



  Dinamic Dispatch no Reflector
Dispatch

  • Exemplo:

    public class Conversor
      {
        public void Converter(string x) { }
        public void Converter(decimal x) { }
      }

      public class SuperConversor : Conversor
      {
        public void Converter(int x) { }
      }
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);
Dispatch

  • Exemplo:

    public class Conversor
      {
        public void Converter(string x) { }
        public void Converter(decimal x) { }
      }

      public class SuperConversor : Conversor
      {
        public void Converter(int x) { }
      }
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();
          d.s = default(S);          S é uma struct
          d.s.i = 6;         i é um campo inteiro da struct
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 - 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)
Dúvidas?
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
Obrigado




       Giovanni Bassi
        giggio@giggio.net
blog: http://unplugged.giggio.net

Mais conteúdo relacionado

Mais procurados

OOP (in portuguese)
OOP (in portuguese)OOP (in portuguese)
OOP (in portuguese)Bruno Pedro
 
Sincronização Distribuída de Processos
Sincronização Distribuída de ProcessosSincronização Distribuída de Processos
Sincronização Distribuída de ProcessosHeron Carvalho
 
Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4CDS
 
Aula c++ estruturas de dados
Aula c++   estruturas de dadosAula c++   estruturas de dados
Aula c++ estruturas de dadosJean Martina
 
Curso avançado de c++ em portugues
Curso avançado de c++ em portuguesCurso avançado de c++ em portugues
Curso avançado de c++ em portuguesLaura
 
2 controle fluxo
2 controle fluxo2 controle fluxo
2 controle fluxoprofwtelles
 
A evolução e o futuro da linguagem C# (1.0, 2.0, 3.0, 4 e 5) - Virtual Develo...
A evolução e o futuro da linguagem C# (1.0, 2.0, 3.0, 4 e 5) - Virtual Develo...A evolução e o futuro da linguagem C# (1.0, 2.0, 3.0, 4 e 5) - Virtual Develo...
A evolução e o futuro da linguagem C# (1.0, 2.0, 3.0, 4 e 5) - Virtual Develo...Rogério Moraes de Carvalho
 
Esta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com RailsEsta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com Railsismaelstahelin
 
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...Marcio Machado Pereira
 

Mais procurados (20)

OOP (in portuguese)
OOP (in portuguese)OOP (in portuguese)
OOP (in portuguese)
 
Canais Síncronos
Canais SíncronosCanais Síncronos
Canais Síncronos
 
Complexidade Cognitiva
Complexidade CognitivaComplexidade Cognitiva
Complexidade Cognitiva
 
Complexidade Ciclomática
Complexidade CiclomáticaComplexidade Ciclomática
Complexidade Ciclomática
 
Aula 05 subprogramas
Aula 05   subprogramasAula 05   subprogramas
Aula 05 subprogramas
 
Linguagem Java
Linguagem JavaLinguagem Java
Linguagem Java
 
Csharp.intro
Csharp.introCsharp.intro
Csharp.intro
 
Sincronização Distribuída de Processos
Sincronização Distribuída de ProcessosSincronização Distribuída de Processos
Sincronização Distribuída de Processos
 
Lab6 flipflop
Lab6 flipflopLab6 flipflop
Lab6 flipflop
 
Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4
 
Aula c++ estruturas de dados
Aula c++   estruturas de dadosAula c++   estruturas de dados
Aula c++ estruturas de dados
 
Curso avançado de c++ em portugues
Curso avançado de c++ em portuguesCurso avançado de c++ em portugues
Curso avançado de c++ em portugues
 
2 controle fluxo
2 controle fluxo2 controle fluxo
2 controle fluxo
 
Linguagem C - Funções
Linguagem C - FunçõesLinguagem C - Funções
Linguagem C - Funções
 
Introdução ao JavaFX
Introdução ao JavaFXIntrodução ao JavaFX
Introdução ao JavaFX
 
A evolução e o futuro da linguagem C# (1.0, 2.0, 3.0, 4 e 5) - Virtual Develo...
A evolução e o futuro da linguagem C# (1.0, 2.0, 3.0, 4 e 5) - Virtual Develo...A evolução e o futuro da linguagem C# (1.0, 2.0, 3.0, 4 e 5) - Virtual Develo...
A evolução e o futuro da linguagem C# (1.0, 2.0, 3.0, 4 e 5) - Virtual Develo...
 
Esta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com RailsEsta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com Rails
 
Notas deaulas
Notas deaulasNotas deaulas
Notas deaulas
 
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
 
C# 4.0
C# 4.0C# 4.0
C# 4.0
 

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

C#4 – O que há de novo
C#4 – O que há de novoC#4 – O que há de novo
C#4 – O que há de novoGiovanni Bassi
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAThiago Cifani
 
Novidades do CSharp 4.0 - C. Augusto Proiete & Henrry Pires
Novidades do CSharp 4.0 - C. Augusto Proiete & Henrry PiresNovidades do CSharp 4.0 - C. Augusto Proiete & Henrry Pires
Novidades do CSharp 4.0 - C. Augusto Proiete & Henrry PiresComunidade NetPonto
 
TypeScript - Campus party 2013
TypeScript - Campus party 2013TypeScript - Campus party 2013
TypeScript - Campus party 2013Giovanni Bassi
 
Android: testes automatizados e TDD
Android: testes automatizados e TDDAndroid: testes automatizados e TDD
Android: testes automatizados e TDDDextra
 
Javascript para CSharpers 2 - Functions
Javascript para CSharpers   2 - FunctionsJavascript para CSharpers   2 - Functions
Javascript para CSharpers 2 - FunctionsWesley Lemos
 
OOP (in portuguese)
OOP (in portuguese)OOP (in portuguese)
OOP (in portuguese)Bruno Pedro
 
S2 b desenvolvimento de sistemas [reparado]
S2 b   desenvolvimento de sistemas [reparado]S2 b   desenvolvimento de sistemas [reparado]
S2 b desenvolvimento de sistemas [reparado]Milena Rebouças
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOWesley Lemos
 
Ruby, Rails e Diversão (Campus Party Brasil 2009)
Ruby, Rails e Diversão (Campus Party Brasil 2009)Ruby, Rails e Diversão (Campus Party Brasil 2009)
Ruby, Rails e Diversão (Campus Party Brasil 2009)Julio Monteiro
 
DDD + BDD + TDD - RF 2015
DDD + BDD + TDD - RF 2015 DDD + BDD + TDD - RF 2015
DDD + BDD + TDD - RF 2015 Eduardo Bregaida
 
tdc-recife-2020-complexidade-cognitiva
tdc-recife-2020-complexidade-cognitivatdc-recife-2020-complexidade-cognitiva
tdc-recife-2020-complexidade-cognitivaDouglas Siviotti
 
Docker para Ambientes de Desenvolvimento e Testes - Open Source Roadshow 2019...
Docker para Ambientes de Desenvolvimento e Testes - Open Source Roadshow 2019...Docker para Ambientes de Desenvolvimento e Testes - Open Source Roadshow 2019...
Docker para Ambientes de Desenvolvimento e Testes - Open Source Roadshow 2019...Renato Groff
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem PythonLuciano Ramalho
 

Semelhante a C#4 - Parte 1 - Dinamismo E Argumentos opcionais e nomeados (20)

C#4 – O que há de novo
C#4 – O que há de novoC#4 – O que há de novo
C#4 – O que há de novo
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 
Novidades do CSharp 4.0 - C. Augusto Proiete & Henrry Pires
Novidades do CSharp 4.0 - C. Augusto Proiete & Henrry PiresNovidades do CSharp 4.0 - C. Augusto Proiete & Henrry Pires
Novidades do CSharp 4.0 - C. Augusto Proiete & Henrry Pires
 
TypeScript - Campus party 2013
TypeScript - Campus party 2013TypeScript - Campus party 2013
TypeScript - Campus party 2013
 
Novidades do CSharp 4.0
Novidades do CSharp 4.0Novidades do CSharp 4.0
Novidades do CSharp 4.0
 
Introdução ao C#
Introdução ao C#Introdução ao C#
Introdução ao C#
 
Jsummit 2014
Jsummit 2014Jsummit 2014
Jsummit 2014
 
Android: testes automatizados e TDD
Android: testes automatizados e TDDAndroid: testes automatizados e TDD
Android: testes automatizados e TDD
 
Javascript para CSharpers 2 - Functions
Javascript para CSharpers   2 - FunctionsJavascript para CSharpers   2 - Functions
Javascript para CSharpers 2 - Functions
 
OOP (in portuguese)
OOP (in portuguese)OOP (in portuguese)
OOP (in portuguese)
 
S2 b desenvolvimento de sistemas [reparado]
S2 b   desenvolvimento de sistemas [reparado]S2 b   desenvolvimento de sistemas [reparado]
S2 b desenvolvimento de sistemas [reparado]
 
Curso de Node JS Básico
Curso de Node JS BásicoCurso de Node JS Básico
Curso de Node JS Básico
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
 
Ruby, Rails e Diversão (Campus Party Brasil 2009)
Ruby, Rails e Diversão (Campus Party Brasil 2009)Ruby, Rails e Diversão (Campus Party Brasil 2009)
Ruby, Rails e Diversão (Campus Party Brasil 2009)
 
DDD + BDD + TDD - RF 2015
DDD + BDD + TDD - RF 2015 DDD + BDD + TDD - RF 2015
DDD + BDD + TDD - RF 2015
 
tdc-recife-2020-complexidade-cognitiva
tdc-recife-2020-complexidade-cognitivatdc-recife-2020-complexidade-cognitiva
tdc-recife-2020-complexidade-cognitiva
 
Visualg
VisualgVisualg
Visualg
 
Docker para Ambientes de Desenvolvimento e Testes - Open Source Roadshow 2019...
Docker para Ambientes de Desenvolvimento e Testes - Open Source Roadshow 2019...Docker para Ambientes de Desenvolvimento e Testes - Open Source Roadshow 2019...
Docker para Ambientes de Desenvolvimento e Testes - Open Source Roadshow 2019...
 
C# básica
C#   básicaC#   básica
C# básica
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem Python
 

Mais de Giovanni Bassi

O que aprendi montando a arquitetura de microsserviços
O que aprendi montando a arquitetura de microsserviçosO que aprendi montando a arquitetura de microsserviços
O que aprendi montando a arquitetura de microsserviçosGiovanni Bassi
 
Analisando dumps de memória de aplicações .NET
Analisando dumps de memória de aplicações .NETAnalisando dumps de memória de aplicações .NET
Analisando dumps de memória de aplicações .NETGiovanni Bassi
 
Async e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraAsync e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraGiovanni Bassi
 
Conhecendo o AKS, o azure container services com kubernetes
Conhecendo o AKS, o azure container services com kubernetesConhecendo o AKS, o azure container services com kubernetes
Conhecendo o AKS, o azure container services com kubernetesGiovanni Bassi
 
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1Giovanni Bassi
 
C#7, 7.1, 7.2, 7.3 e C# 8
C#7, 7.1, 7.2, 7.3 e C# 8C#7, 7.1, 7.2, 7.3 e C# 8
C#7, 7.1, 7.2, 7.3 e C# 8Giovanni Bassi
 
Engenharia ágil de ponta a ponta do clone ao deploy
Engenharia ágil de ponta a ponta do clone ao deployEngenharia ágil de ponta a ponta do clone ao deploy
Engenharia ágil de ponta a ponta do clone ao deployGiovanni Bassi
 
Entrega contínua fica mais fácil com contêineres
Entrega contínua fica mais fácil com contêineresEntrega contínua fica mais fácil com contêineres
Entrega contínua fica mais fácil com contêineresGiovanni Bassi
 
.NET Core, ASP.NET Core e .NET Standard 2
.NET Core, ASP.NET Core e .NET Standard 2.NET Core, ASP.NET Core e .NET Standard 2
.NET Core, ASP.NET Core e .NET Standard 2Giovanni Bassi
 
.NET com contêineres Windows e Linux
.NET com contêineres Windows e Linux.NET com contêineres Windows e Linux
.NET com contêineres Windows e LinuxGiovanni Bassi
 
Async e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraAsync e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraGiovanni Bassi
 
Compartilhando código entre frontend e backend com Node.js
Compartilhando código entre frontend e backend com Node.jsCompartilhando código entre frontend e backend com Node.js
Compartilhando código entre frontend e backend com Node.jsGiovanni Bassi
 
Construindo uma ferramenta CLI multiplataforma com Node.js
Construindo uma ferramenta CLI multiplataforma com Node.jsConstruindo uma ferramenta CLI multiplataforma com Node.js
Construindo uma ferramenta CLI multiplataforma com Node.jsGiovanni Bassi
 
Um mergulho nos containers windows
Um mergulho nos containers windowsUm mergulho nos containers windows
Um mergulho nos containers windowsGiovanni Bassi
 
Por dentro do .NET Core
Por dentro do .NET CorePor dentro do .NET Core
Por dentro do .NET CoreGiovanni Bassi
 
Build e release pipeline com docker
Build e release pipeline com dockerBuild e release pipeline com docker
Build e release pipeline com dockerGiovanni Bassi
 
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...Giovanni Bassi
 

Mais de Giovanni Bassi (20)

O que aprendi montando a arquitetura de microsserviços
O que aprendi montando a arquitetura de microsserviçosO que aprendi montando a arquitetura de microsserviços
O que aprendi montando a arquitetura de microsserviços
 
Sendo ágil com git
Sendo ágil com gitSendo ágil com git
Sendo ágil com git
 
Analisando dumps de memória de aplicações .NET
Analisando dumps de memória de aplicações .NETAnalisando dumps de memória de aplicações .NET
Analisando dumps de memória de aplicações .NET
 
Novidades do c# 7 e 8
Novidades do c# 7 e 8Novidades do c# 7 e 8
Novidades do c# 7 e 8
 
Async e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraAsync e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agora
 
Conhecendo o AKS, o azure container services com kubernetes
Conhecendo o AKS, o azure container services com kubernetesConhecendo o AKS, o azure container services com kubernetes
Conhecendo o AKS, o azure container services com kubernetes
 
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
 
C#7, 7.1, 7.2, 7.3 e C# 8
C#7, 7.1, 7.2, 7.3 e C# 8C#7, 7.1, 7.2, 7.3 e C# 8
C#7, 7.1, 7.2, 7.3 e C# 8
 
Engenharia ágil de ponta a ponta do clone ao deploy
Engenharia ágil de ponta a ponta do clone ao deployEngenharia ágil de ponta a ponta do clone ao deploy
Engenharia ágil de ponta a ponta do clone ao deploy
 
Entrega contínua fica mais fácil com contêineres
Entrega contínua fica mais fácil com contêineresEntrega contínua fica mais fácil com contêineres
Entrega contínua fica mais fácil com contêineres
 
.NET Core, ASP.NET Core e .NET Standard 2
.NET Core, ASP.NET Core e .NET Standard 2.NET Core, ASP.NET Core e .NET Standard 2
.NET Core, ASP.NET Core e .NET Standard 2
 
.NET com contêineres Windows e Linux
.NET com contêineres Windows e Linux.NET com contêineres Windows e Linux
.NET com contêineres Windows e Linux
 
Async e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraAsync e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agora
 
Compartilhando código entre frontend e backend com Node.js
Compartilhando código entre frontend e backend com Node.jsCompartilhando código entre frontend e backend com Node.js
Compartilhando código entre frontend e backend com Node.js
 
Construindo uma ferramenta CLI multiplataforma com Node.js
Construindo uma ferramenta CLI multiplataforma com Node.jsConstruindo uma ferramenta CLI multiplataforma com Node.js
Construindo uma ferramenta CLI multiplataforma com Node.js
 
O Futuro do C#: C#8
O Futuro do C#: C#8O Futuro do C#: C#8
O Futuro do C#: C#8
 
Um mergulho nos containers windows
Um mergulho nos containers windowsUm mergulho nos containers windows
Um mergulho nos containers windows
 
Por dentro do .NET Core
Por dentro do .NET CorePor dentro do .NET Core
Por dentro do .NET Core
 
Build e release pipeline com docker
Build e release pipeline com dockerBuild e release pipeline com docker
Build e release pipeline com docker
 
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
 

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

  • 1. ASP.NET MVC – C#4 – Dinamismo e argumentos opcionais e nomeados Giovanni Bassi giggio@giggio.net blog: http://unplugged.giggio.net
  • 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. 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. 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. 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. Evolução C# C#4 C#3 • Facilidade de uso • LINQ C#2 • Generics C#1 • Versão inicial
  • 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. 4 novidades • Construções dinâmicas • Argumentos opcionais e argumentos nomeados • Variância para tipos genéricos • Melhorias na interoperabilidade com o COM
  • 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. 4 novidades • Construções dinâmicas • Argumentos opcionais e argumentos nomeados • Variância para tipos genéricos • Melhorias na interoperabilidade com o COM
  • 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. 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. Argumentos • Chamada: como era antes? var elevador = new Elevador(); elevador.Subir(1,1); //Obrigatório informar
  • 15. Argumentos • Chamada: como é agora? var elevador = new Elevador(); elevador.Subir();
  • 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. Argumentos • Declaração: como é agora? public class ElevadorCS { public void Subir(int andares = 1, int velocidade = 1) { } }
  • 18. Argumentos • Vantagens – Mais claro – Mais explícito – Mais simples • Desvantagens – Se mal usado pode incentivar métodos com parâmetros demais
  • 19. Argumentos • Regras – Parâmetros opcionais são os últimos do método public void Subir(int andares = 1, int velocidade) {}
  • 20. Argumentos • Regras – Parâmetros opcionais são os últimos do método public void Subir(int andares = 1, int velocidade) {}
  • 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. 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()) {}
  • 24. Argumentos • Como era antes? var elevador2 = new ElevadorCS(); elevador2.Subir(2, 3);
  • 25. Argumentos • Como é agora? var elevador2 = new ElevadorCS(); elevador2.Subir(); elevador2.Subir(velocidade: 2); elevador2.Subir(velocidade: 2, andares: 3);
  • 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. Demo Demo Argumentos opcionais e nomeados
  • 30. C# Dinâmico • Motivação – Hype das linguagens dinâmicas – Produtividade – Testes – Interoperabilidade
  • 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. 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. 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. C# Dinâmico • Mais Exemplos var d2 = d.AlgumValor(); var d3 = ObterVariavelDinamica();
  • 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. Demo Demo Static Dispatch no Reflector
  • 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. 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. 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. Demo Demo Dinamic Dispatch no Reflector
  • 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. 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. 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. Regra base 1 A idéia é replicar o comportamento estático, como se as chamadas não fossem dinâmicas
  • 45. Não funciona • Métodos de extensão • LINQ (depende de métodos de extensão)
  • 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. Demo Demo C# Dinâmico
  • 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)
  • 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. Obrigado Giovanni Bassi giggio@giggio.net blog: http://unplugged.giggio.net