SlideShare une entreprise Scribd logo
1  sur  75
C#4 – O que há de novo Giovanni Bassigiggio@giggio.net http://giovannibassi.comhttp://unplugged.giggio.net
Giovanni Bassi ,[object Object]
Microsoft MVP
Consultoria, gestão, mentoring
Treinamento
C#, VB, J#, F#, IronRuby, etc... (Beta a beta)
Dezenas de artigos na .Net Magazine
Editor técnico da .Net Magazine
Palestrante
Professor universitário
Líder e fundador do .Net Architects (1º grupo de arquitetura de software com .Net do Brasil)
Inetaboardmember,[object Object]
Cerca de sete mil mensagens desde sua criação
Em torno de mil mensagens por mês
Cerca de 350 membros online
11 reuniões presenciais até agora
Revista a caminho
Podcast recentemente liberado
Efetivamente um dos maiores e mais ativos grupos do país
100 pessoas presentes no último (e primeiro) evento
Próxima reunião em 8 de Agosto, falando sobre OSLO com Waldemir Cambiucci (arquiteto Microsoft),[object Object]
Blog técnico: http://unplugged.giggio.net
Site: http://giovannibassi.com
Twitter: @giovannibassi
.Net Architects: Grupo: http://dotnetarchitects.net Podcast: http://podcast.dotnetarchitects.net Online: http://tinyurl.com/DotNetArch Twitter: #DotNetArchitects Online @
Agenda
Ferramental eEvolução
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 do C#
C# e VB Lado a Lado com VB Sem separação de perfil de desenvolvedor (Mas não espere XML Literals no C# )
Quatro Grandes Novidades Construções dinâmicas Argumentos opcionais e argumentos nomeados Variância para tipos genéricos Melhorias na interoperabilidade com o COM
Argumentos 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)
VB (criando o método): PublicClass Elevador PublicSub Subir( _ OptionalByVal andares AsInteger = 1, _ OptionalByVal velocidade AsInteger = 1) EndSub EndClass
Chamada: como era antes? var elevador = newElevador(); elevador.Subir(1,1); //Obrigatório informar
Chamada: como é agora? var elevador = newElevador(); elevador.Subir();
Declaração: como era antes? publicclassElevadorCS     { publicvoid Subir()         { this.Subir(1, 1);         } publicvoid Subir(int andares)         { this.Subir(andares, 1);         } publicvoid Subir(int andares, int velocidade)         {         }     }
Declaração: como é agora? publicclassElevadorCS     { publicvoid Subir(int andares = 1,  int velocidade = 1)         {         }     }
Vantagens e desvantagens Vantagens Mais claro Mais explícito Mais simples Desvantagens Se mal usado pode incentivar métodos com parâmetros demais
Regras Parâmetros opcionais são os últimos do método ,[object Object],publicvoid Subir(int andares = 1,  int velocidade) {} publicvoid Subir(int andares,  int velocidade =ObterVelocidade()) {}
Argumentos nomeados
Como era antes? var elevador2 = newElevadorCS(); elevador2.Subir(2, 3);
Como é agora? var elevador2 = newElevadorCS(); elevador2.Subir(); elevador2.Subir(velocidade: 2); elevador2.Subir(velocidade: 2,andares: 3);
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 publicvoid Subir( int andares = 1,  int velocidade = 1) {} elevador2.Subir(                 velocidade: this.ObterVelocidade(),                  andares: this.ObterAndares()                 ); Primeiro Segundo
Argumentos opcionais e nomeados
C# dinâmico
Motivação Motivação Hype das linguagens dinâmicas Produtividade Testes Interoperabilidade Extensibilidade
Exemplo Teste com Cucumber e RSpec (IronRuby): Feature: Search courses   In order to ensure better utilization of courses   Potential students should be able to search for courses   Scenario: Search by topic     Given there are 240 courses which do not have the topic "biology"     And there are 3 courses A,B,C that each have "biology" as one of the topics     When I search for "biology"     Then I should see the following courses:       | title |       | A     |       | B     |       | C     |
Entendendo a infra DynamicLanguage Runtime (DLR) agora é parte da BCL Microsoft.CSharp é obrigatória para trabalhar com dynamic Somente no .Net 4.0
Entendendo o dynamic Tipos são “estáticamentetipados 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
Exemplos dynamic d; dynamic d1 = 3; d1 = DateTime.Now; d.QualquerCoisa(3); Console.Writeline(d[10]); d.Propriedade1 = d.Propriedade2; d += 1; var a = d + Datetime.Now(); d("algumparâmetro", 3); var d2 = d.AlgumValor(); var d3 = ObterVariavelDinamica();
Entendendo o StaticDispatch É o comum até o C# 3.0 Ligação forte com o método sendo chamado Sem perda de performance
Entendendo o DynamicDispatch A resolução do método é feita em tempo de execução Se for uma chamada sobre um tipo dinâmico (dynamicreceiver), a chamada é dinâmica (ligada em runtime) Se for uma chamada sobre um tipo e método estáticos (staticreceiver), mas houver um parâmetro dinâmico, também é uma chamada dinâmica (ligada em runtime)
Cuidado O que acontece aqui? staticintFuncao(int z) { return 1; } staticvoid Main() { dynamic x = 3; DateTime y = Funcao(x); }
DynamicDispath != Virtual Dispath Só pra constar, porque não vai dar tempo de explicar Vejam uma discussão no .Net Architects: http://tinyurl.com/virtualdispatch
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
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
Static e DinamicDispatch no Reflector
Exemplo publicclassConversor { publicvoid Converter(string x) { } publicvoid Converter(decimal x) { } } publicclassSuperConversor : Conversor { publicvoid Converter(int x) { } }
Pegadinha ,[object Object],Conversor c1 = newSuperConversor(); inti = 10; c1.Converter(i); Conversor c2 = newSuperConversor(); dynamic d1 = 10; c2.Converter(d1);
Resposta publicclassConversor { publicvoid Converter(string x) { } publicvoid Converter(decimal x) { } } publicclassSuperConversor : Conversor { publicvoid Converter(int x) { } }
Regra 1 A idéia é replicar o comportamento estático, como se as chamadas não fossem dinâmicas
Regra 2 Dynamic é um Object. Cuidado com Boxing e Unboxing. dynamic d = new AlgumaClasse(); d.s = default(S); d.s.i = 6; S é uma struct i é um campo inteiro da struct Valendo mil reais… Qual o valor de i?
Não funcionam Métodos de extensão LINQ (depende de métodos de extensão)
C# dinâmico
COM Interop
Novidades Não precisamos mais da palavra-chave ref(o compilador coloca sozinho) Não precisamos de cast de tipos de valor para object Com o suporte de parâmetros opcionais e nomeados, passamos só o necessário Igualzinho ao que há no VB.Net desde o .Net 1.0 e VB 7 (2002) Temos ainda opção de mesclar o assembly de interop
Como era antes? ApplicationClassWordApp = newApplicationClass();   WordApp.Visible = true;   objectmissing = System.Reflection.Missing.Value;   objectreadOnly = false;   objectfileName = "Documento.docx";   Word.Documentdoc = WordApp.Documents.Open( reffileName, refmissing, refreadOnly, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing);
Como é no VB? DimWordApp = New Word.ApplicationClass() WordApp.Visible = True DimfileName = "Documento.docx" DimdocAsDocument = _ WordApp.Documents.Open( _ fileName:=fileName, ReadOnly:=True)
Como é agora? varWordApp = newApplicationClass();   WordApp.Visible = true;   stringfileName = "Documento.docx";   vardoc = WordApp.Documents.Open( fileName, ReadOnly:false);
VB e C# lado a lado: varWordApp = newApplicationClass();   WordApp.Visible = true;   stringfileName = "Documento.docx";   vardoc = WordApp.Documents.Open( fileName, ReadOnly:false); C# DimWordApp = New Word.ApplicationClass() WordApp.Visible = True DimfileName = "Documento.docx" DimdocAsDocument = _ WordApp.Documents.Open( _ fileName:=fileName, ReadOnly:=True) VB
O que é compilado: ApplicationWordApp = (Application) Activator.CreateInstance( Type.GetTypeFromCLSID(newGuid("000209FF-0000-0000-C000-000000000046"))); WordApp.Visible = true; stringfileName = "Documento.docx"; object <>r__ComRefCallLocal0 = fileName; object <>r__ComRefCallLocal1 = false; object <>r__ComRefCallLocal2 = Type.Missing; object <>r__ComRefCallLocal3 = Type.Missing; object <>r__ComRefCallLocal4 = Type.Missing; object <>r__ComRefCallLocal5 = Type.Missing; object <>r__ComRefCallLocal6 = Type.Missing; object <>r__ComRefCallLocal7 = Type.Missing; object <>r__ComRefCallLocal8 = Type.Missing; object <>r__ComRefCallLocal9 = Type.Missing; object <>r__ComRefCallLocala = Type.Missing; object <>r__ComRefCallLocalb = Type.Missing; object <>r__ComRefCallLocalc = Type.Missing; object <>r__ComRefCallLocald = Type.Missing; object <>r__ComRefCallLocale = Type.Missing; object <>r__ComRefCallLocalf = Type.Missing; objectaDoc = WordApp.Documents.Open( ref <>r__ComRefCallLocal0,     ref <>r__ComRefCallLocal2,  ref <>r__ComRefCallLocal1,     ref <>r__ComRefCallLocal3,  ref <>r__ComRefCallLocal4,     ref <>r__ComRefCallLocal5,  ref <>r__ComRefCallLocal6,     ref <>r__ComRefCallLocal7,  ref <>r__ComRefCallLocal8,     ref <>r__ComRefCallLocal9, ref <>r__ComRefCallLocala,     ref <>r__ComRefCallLocalb,  ref <>r__ComRefCallLocalc,     ref <>r__ComRefCallLocald,  ref <>r__ComRefCallLocale,     ref <>r__ComRefCallLocalf);
Mesclando o assembly de interop
Com interop
Variância

Contenu connexe

Tendances

Delphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTIDelphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTIMario Guedes
 
Delphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-Thread
Delphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-ThreadDelphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-Thread
Delphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-ThreadMario Guedes
 
[Ruby Summit Brasil 2020] Ruby 3 e Análise estática - O que esperar e o que s...
[Ruby Summit Brasil 2020] Ruby 3 e Análise estática - O que esperar e o que s...[Ruby Summit Brasil 2020] Ruby 3 e Análise estática - O que esperar e o que s...
[Ruby Summit Brasil 2020] Ruby 3 e Análise estática - O que esperar e o que s...Weverton Timoteo
 
E:\Plp 2009 2\Plp Aula11
E:\Plp 2009 2\Plp Aula11E:\Plp 2009 2\Plp Aula11
E:\Plp 2009 2\Plp Aula11Ismar Silveira
 
Apostila de Introdução a POO com C#
Apostila de Introdução a POO com C#Apostila de Introdução a POO com C#
Apostila de Introdução a POO com C#Andre Nascimento
 
BDD: Torne viva a documentação de seus sistemas
BDD: Torne viva a documentação de seus sistemasBDD: Torne viva a documentação de seus sistemas
BDD: Torne viva a documentação de seus sistemasVitor Mattos
 
Introdução à linguagem de programação Python
Introdução à linguagem de programação PythonIntrodução à linguagem de programação Python
Introdução à linguagem de programação PythonCarlos Schults
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOWesley Lemos
 
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011Emerson Macedo
 
Python - Orientação a Objetos com UML no Batismo Digital 3.0 da Faculdade JK ...
Python - Orientação a Objetos com UML no Batismo Digital 3.0 da Faculdade JK ...Python - Orientação a Objetos com UML no Batismo Digital 3.0 da Faculdade JK ...
Python - Orientação a Objetos com UML no Batismo Digital 3.0 da Faculdade JK ...George Mendonça
 
Conhecendo Ruby on Rails
Conhecendo Ruby on RailsConhecendo Ruby on Rails
Conhecendo Ruby on RailsSergio Henrique
 
Python - Introdução Básica
Python - Introdução BásicaPython - Introdução Básica
Python - Introdução BásicaChristian Perone
 
Ruby 3 e Análise estática - O que esperar e o que significa para o nosso código
Ruby 3 e Análise estática - O que esperar e o que significa para o nosso códigoRuby 3 e Análise estática - O que esperar e o que significa para o nosso código
Ruby 3 e Análise estática - O que esperar e o que significa para o nosso códigoWeverton Timoteo
 

Tendances (19)

POO - Aula 10 - Polimorfismo
POO - Aula 10 - PolimorfismoPOO - Aula 10 - Polimorfismo
POO - Aula 10 - Polimorfismo
 
Delphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTIDelphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTI
 
Delphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-Thread
Delphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-ThreadDelphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-Thread
Delphi Conference 2012 - Controlando a Concorrência em Aplicações Multi-Thread
 
Linguagem Java
Linguagem JavaLinguagem Java
Linguagem Java
 
[Ruby Summit Brasil 2020] Ruby 3 e Análise estática - O que esperar e o que s...
[Ruby Summit Brasil 2020] Ruby 3 e Análise estática - O que esperar e o que s...[Ruby Summit Brasil 2020] Ruby 3 e Análise estática - O que esperar e o que s...
[Ruby Summit Brasil 2020] Ruby 3 e Análise estática - O que esperar e o que s...
 
E:\Plp 2009 2\Plp Aula11
E:\Plp 2009 2\Plp Aula11E:\Plp 2009 2\Plp Aula11
E:\Plp 2009 2\Plp Aula11
 
POO - Aula 003
POO - Aula 003POO - Aula 003
POO - Aula 003
 
Apostila de Introdução a POO com C#
Apostila de Introdução a POO com C#Apostila de Introdução a POO com C#
Apostila de Introdução a POO com C#
 
Clean code em C#
Clean code em C#Clean code em C#
Clean code em C#
 
BDD: Torne viva a documentação de seus sistemas
BDD: Torne viva a documentação de seus sistemasBDD: Torne viva a documentação de seus sistemas
BDD: Torne viva a documentação de seus sistemas
 
Introdução à linguagem de programação Python
Introdução à linguagem de programação PythonIntrodução à linguagem de programação Python
Introdução à linguagem de programação Python
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
 
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
 
Programação Funcional usando C#
Programação Funcional usando C#Programação Funcional usando C#
Programação Funcional usando C#
 
Python - Orientação a Objetos com UML no Batismo Digital 3.0 da Faculdade JK ...
Python - Orientação a Objetos com UML no Batismo Digital 3.0 da Faculdade JK ...Python - Orientação a Objetos com UML no Batismo Digital 3.0 da Faculdade JK ...
Python - Orientação a Objetos com UML no Batismo Digital 3.0 da Faculdade JK ...
 
Conhecendo Ruby on Rails
Conhecendo Ruby on RailsConhecendo Ruby on Rails
Conhecendo Ruby on Rails
 
Python - Introdução Básica
Python - Introdução BásicaPython - Introdução Básica
Python - Introdução Básica
 
Ruby 3 e Análise estática - O que esperar e o que significa para o nosso código
Ruby 3 e Análise estática - O que esperar e o que significa para o nosso códigoRuby 3 e Análise estática - O que esperar e o que significa para o nosso código
Ruby 3 e Análise estática - O que esperar e o que significa para o nosso código
 
Ruby & Rails
Ruby & RailsRuby & Rails
Ruby & Rails
 

En vedette

Boletim edição especial recepção feras 2013.1 (1)
Boletim edição  especial recepção feras 2013.1 (1)Boletim edição  especial recepção feras 2013.1 (1)
Boletim edição especial recepção feras 2013.1 (1)Espaço Pethistória
 
Corellia esittely referensseja_2016
Corellia esittely referensseja_2016Corellia esittely referensseja_2016
Corellia esittely referensseja_2016Corellia Helsinki
 
Idiofonos
IdiofonosIdiofonos
Idiofonosjulia60
 
Basic income report FINAL
Basic income report FINALBasic income report FINAL
Basic income report FINALAnthony Painter
 
Dennis Kelleher resume 2.15.15
Dennis Kelleher resume 2.15.15Dennis Kelleher resume 2.15.15
Dennis Kelleher resume 2.15.15Dennis Kelleher
 
Gbi jimdo11
Gbi jimdo11Gbi jimdo11
Gbi jimdo11vifrac
 
Christmas in albacete
Christmas in albaceteChristmas in albacete
Christmas in albacetetontas
 
Thực trạng hoạt động phân tích báo cáo tài chính tại công ty tnhh cung ứng v...
Thực trạng hoạt động phân tích báo cáo tài chính tại công ty tnhh cung ứng  v...Thực trạng hoạt động phân tích báo cáo tài chính tại công ty tnhh cung ứng  v...
Thực trạng hoạt động phân tích báo cáo tài chính tại công ty tnhh cung ứng v...https://www.facebook.com/garmentspace
 
State of Lending Release Slideshow
State of Lending Release SlideshowState of Lending Release Slideshow
State of Lending Release SlideshowM William Sermons
 
Customs Rules & regulation for moving to Australia
Customs Rules & regulation for moving to AustraliaCustoms Rules & regulation for moving to Australia
Customs Rules & regulation for moving to Australiavishalsaxena42y
 

En vedette (20)

Cesar vallejo
Cesar vallejoCesar vallejo
Cesar vallejo
 
Boletim edição especial recepção feras 2013.1 (1)
Boletim edição  especial recepção feras 2013.1 (1)Boletim edição  especial recepção feras 2013.1 (1)
Boletim edição especial recepção feras 2013.1 (1)
 
OSHA 655
OSHA 655OSHA 655
OSHA 655
 
ADJUNCT LECTURER TOR_latest 2015
ADJUNCT LECTURER TOR_latest 2015ADJUNCT LECTURER TOR_latest 2015
ADJUNCT LECTURER TOR_latest 2015
 
Casa de abeto rustica
Casa de abeto rusticaCasa de abeto rustica
Casa de abeto rustica
 
Corellia esittely referensseja_2016
Corellia esittely referensseja_2016Corellia esittely referensseja_2016
Corellia esittely referensseja_2016
 
ciencia
ciencia ciencia
ciencia
 
Flagstaff CVB Re-Imaging
Flagstaff CVB Re-Imaging Flagstaff CVB Re-Imaging
Flagstaff CVB Re-Imaging
 
Idiofonos
IdiofonosIdiofonos
Idiofonos
 
End Of Semester Slideshow, WHC 8th 2009
End Of Semester Slideshow, WHC 8th 2009End Of Semester Slideshow, WHC 8th 2009
End Of Semester Slideshow, WHC 8th 2009
 
Basic income report FINAL
Basic income report FINALBasic income report FINAL
Basic income report FINAL
 
Dennis Kelleher resume 2.15.15
Dennis Kelleher resume 2.15.15Dennis Kelleher resume 2.15.15
Dennis Kelleher resume 2.15.15
 
Ia sojung
Ia sojungIa sojung
Ia sojung
 
Gbi jimdo11
Gbi jimdo11Gbi jimdo11
Gbi jimdo11
 
Christmas in albacete
Christmas in albaceteChristmas in albacete
Christmas in albacete
 
7 Fundamental Pillars To Build A Believer...
                                    7 Fundamental Pillars To Build A Believer...                                    7 Fundamental Pillars To Build A Believer...
7 Fundamental Pillars To Build A Believer...
 
Thực trạng hoạt động phân tích báo cáo tài chính tại công ty tnhh cung ứng v...
Thực trạng hoạt động phân tích báo cáo tài chính tại công ty tnhh cung ứng  v...Thực trạng hoạt động phân tích báo cáo tài chính tại công ty tnhh cung ứng  v...
Thực trạng hoạt động phân tích báo cáo tài chính tại công ty tnhh cung ứng v...
 
State of Lending Release Slideshow
State of Lending Release SlideshowState of Lending Release Slideshow
State of Lending Release Slideshow
 
Customs Rules & regulation for moving to Australia
Customs Rules & regulation for moving to AustraliaCustoms Rules & regulation for moving to Australia
Customs Rules & regulation for moving to Australia
 
Darío vélez lópez 1
Darío vélez lópez 1Darío vélez lópez 1
Darío vélez lópez 1
 

Similaire à C#4 Novidades

C#4 - Parte 1 - Dinamismo E Argumentos opcionais e nomeados
C#4 - Parte 1 - Dinamismo E Argumentos opcionais e nomeadosC#4 - Parte 1 - Dinamismo E Argumentos opcionais e nomeados
C#4 - Parte 1 - Dinamismo E Argumentos opcionais e nomeadosGiovanni Bassi
 
Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4CDS
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoPaulo Morgado
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
TypeScript - Campus party 2013
TypeScript - Campus party 2013TypeScript - Campus party 2013
TypeScript - Campus party 2013Giovanni Bassi
 
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
 
C# 6.0 - Interopmix 2015
C# 6.0 - Interopmix 2015C# 6.0 - Interopmix 2015
C# 6.0 - Interopmix 2015Renato Groff
 
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
 
Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverEduardo Jorge
 
C# 6.0 - DotNetBaixada - Novembro/2015
C# 6.0 - DotNetBaixada - Novembro/2015C# 6.0 - DotNetBaixada - Novembro/2015
C# 6.0 - DotNetBaixada - Novembro/2015Renato Groff
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a TestesGregorio Melo
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHGiovanni Bassi
 

Similaire à C#4 Novidades (20)

C#4 - Parte 1 - Dinamismo E Argumentos opcionais e nomeados
C#4 - Parte 1 - Dinamismo E Argumentos opcionais e nomeadosC#4 - Parte 1 - Dinamismo E Argumentos opcionais e nomeados
C#4 - Parte 1 - Dinamismo E Argumentos opcionais e nomeados
 
Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPonto
 
C++11
C++11C++11
C++11
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Novidades do CSharp 4.0
Novidades do CSharp 4.0Novidades do CSharp 4.0
Novidades do CSharp 4.0
 
TypeScript - Campus party 2013
TypeScript - Campus party 2013TypeScript - Campus party 2013
TypeScript - Campus party 2013
 
Programação Defensiva
Programação DefensivaProgramação Defensiva
Programação Defensiva
 
Curso de Node JS Básico
Curso de Node JS BásicoCurso de Node JS Básico
Curso de Node JS Básico
 
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
 
C# 6.0 - Interopmix 2015
C# 6.0 - Interopmix 2015C# 6.0 - Interopmix 2015
C# 6.0 - Interopmix 2015
 
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
 
Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserver
 
Semanaupecaruaru2013 c++para iniciantes
Semanaupecaruaru2013 c++para iniciantesSemanaupecaruaru2013 c++para iniciantes
Semanaupecaruaru2013 c++para iniciantes
 
C# 6.0 - DotNetBaixada - Novembro/2015
C# 6.0 - DotNetBaixada - Novembro/2015C# 6.0 - DotNetBaixada - Novembro/2015
C# 6.0 - DotNetBaixada - Novembro/2015
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Reflections
ReflectionsReflections
Reflections
 
Working with legacy code 3
Working with legacy code 3Working with legacy code 3
Working with legacy code 3
 
Refactoring - Design no Código
Refactoring - Design no CódigoRefactoring - Design no Código
Refactoring - Design no Código
 

Plus 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
 

Plus 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 Novidades

  • 1. C#4 – O que há de novo Giovanni Bassigiggio@giggio.net http://giovannibassi.comhttp://unplugged.giggio.net
  • 2.
  • 6. C#, VB, J#, F#, IronRuby, etc... (Beta a beta)
  • 7. Dezenas de artigos na .Net Magazine
  • 8. Editor técnico da .Net Magazine
  • 11. Líder e fundador do .Net Architects (1º grupo de arquitetura de software com .Net do Brasil)
  • 12.
  • 13. Cerca de sete mil mensagens desde sua criação
  • 14. Em torno de mil mensagens por mês
  • 15. Cerca de 350 membros online
  • 19. Efetivamente um dos maiores e mais ativos grupos do país
  • 20. 100 pessoas presentes no último (e primeiro) evento
  • 21.
  • 25. .Net Architects: Grupo: http://dotnetarchitects.net Podcast: http://podcast.dotnetarchitects.net Online: http://tinyurl.com/DotNetArch Twitter: #DotNetArchitects Online @
  • 28. 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...)
  • 30. C# e VB Lado a Lado com VB Sem separação de perfil de desenvolvedor (Mas não espere XML Literals no C# )
  • 31. Quatro Grandes Novidades Construções dinâmicas Argumentos opcionais e argumentos nomeados Variância para tipos genéricos Melhorias na interoperabilidade com o COM
  • 33. 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)
  • 34. VB (criando o método): PublicClass Elevador PublicSub Subir( _ OptionalByVal andares AsInteger = 1, _ OptionalByVal velocidade AsInteger = 1) EndSub EndClass
  • 35. Chamada: como era antes? var elevador = newElevador(); elevador.Subir(1,1); //Obrigatório informar
  • 36. Chamada: como é agora? var elevador = newElevador(); elevador.Subir();
  • 37. Declaração: como era antes? publicclassElevadorCS { publicvoid Subir() { this.Subir(1, 1); } publicvoid Subir(int andares) { this.Subir(andares, 1); } publicvoid Subir(int andares, int velocidade) { } }
  • 38. Declaração: como é agora? publicclassElevadorCS { publicvoid Subir(int andares = 1, int velocidade = 1) { } }
  • 39. Vantagens e desvantagens Vantagens Mais claro Mais explícito Mais simples Desvantagens Se mal usado pode incentivar métodos com parâmetros demais
  • 40.
  • 42. Como era antes? var elevador2 = newElevadorCS(); elevador2.Subir(2, 3);
  • 43. Como é agora? var elevador2 = newElevadorCS(); elevador2.Subir(); elevador2.Subir(velocidade: 2); elevador2.Subir(velocidade: 2,andares: 3);
  • 44. 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 publicvoid Subir( int andares = 1, int velocidade = 1) {} elevador2.Subir( velocidade: this.ObterVelocidade(), andares: this.ObterAndares() ); Primeiro Segundo
  • 47. Motivação Motivação Hype das linguagens dinâmicas Produtividade Testes Interoperabilidade Extensibilidade
  • 48. Exemplo Teste com Cucumber e RSpec (IronRuby): Feature: Search courses In order to ensure better utilization of courses Potential students should be able to search for courses Scenario: Search by topic Given there are 240 courses which do not have the topic "biology" And there are 3 courses A,B,C that each have "biology" as one of the topics When I search for "biology" Then I should see the following courses: | title | | A | | B | | C |
  • 49. Entendendo a infra DynamicLanguage Runtime (DLR) agora é parte da BCL Microsoft.CSharp é obrigatória para trabalhar com dynamic Somente no .Net 4.0
  • 50. Entendendo o dynamic Tipos são “estáticamentetipados 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
  • 51. Exemplos dynamic d; dynamic d1 = 3; d1 = DateTime.Now; d.QualquerCoisa(3); Console.Writeline(d[10]); d.Propriedade1 = d.Propriedade2; d += 1; var a = d + Datetime.Now(); d("algumparâmetro", 3); var d2 = d.AlgumValor(); var d3 = ObterVariavelDinamica();
  • 52. Entendendo o StaticDispatch É o comum até o C# 3.0 Ligação forte com o método sendo chamado Sem perda de performance
  • 53. Entendendo o DynamicDispatch A resolução do método é feita em tempo de execução Se for uma chamada sobre um tipo dinâmico (dynamicreceiver), a chamada é dinâmica (ligada em runtime) Se for uma chamada sobre um tipo e método estáticos (staticreceiver), mas houver um parâmetro dinâmico, também é uma chamada dinâmica (ligada em runtime)
  • 54. Cuidado O que acontece aqui? staticintFuncao(int z) { return 1; } staticvoid Main() { dynamic x = 3; DateTime y = Funcao(x); }
  • 55. DynamicDispath != Virtual Dispath Só pra constar, porque não vai dar tempo de explicar Vejam uma discussão no .Net Architects: http://tinyurl.com/virtualdispatch
  • 56. 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
  • 57. 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
  • 58. Static e DinamicDispatch no Reflector
  • 59. Exemplo publicclassConversor { publicvoid Converter(string x) { } publicvoid Converter(decimal x) { } } publicclassSuperConversor : Conversor { publicvoid Converter(int x) { } }
  • 60.
  • 61. Resposta publicclassConversor { publicvoid Converter(string x) { } publicvoid Converter(decimal x) { } } publicclassSuperConversor : Conversor { publicvoid Converter(int x) { } }
  • 62. Regra 1 A idéia é replicar o comportamento estático, como se as chamadas não fossem dinâmicas
  • 63. Regra 2 Dynamic é um Object. Cuidado com Boxing e Unboxing. dynamic d = new AlgumaClasse(); d.s = default(S); d.s.i = 6; S é uma struct i é um campo inteiro da struct Valendo mil reais… Qual o valor de i?
  • 64. Não funcionam Métodos de extensão LINQ (depende de métodos de extensão)
  • 67. Novidades Não precisamos mais da palavra-chave ref(o compilador coloca sozinho) Não precisamos de cast de tipos de valor para object Com o suporte de parâmetros opcionais e nomeados, passamos só o necessário Igualzinho ao que há no VB.Net desde o .Net 1.0 e VB 7 (2002) Temos ainda opção de mesclar o assembly de interop
  • 68. Como era antes? ApplicationClassWordApp = newApplicationClass();  WordApp.Visible = true;  objectmissing = System.Reflection.Missing.Value;  objectreadOnly = false;  objectfileName = "Documento.docx";  Word.Documentdoc = WordApp.Documents.Open( reffileName, refmissing, refreadOnly, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing);
  • 69. Como é no VB? DimWordApp = New Word.ApplicationClass() WordApp.Visible = True DimfileName = "Documento.docx" DimdocAsDocument = _ WordApp.Documents.Open( _ fileName:=fileName, ReadOnly:=True)
  • 70. Como é agora? varWordApp = newApplicationClass();  WordApp.Visible = true;  stringfileName = "Documento.docx";  vardoc = WordApp.Documents.Open( fileName, ReadOnly:false);
  • 71. VB e C# lado a lado: varWordApp = newApplicationClass();  WordApp.Visible = true;  stringfileName = "Documento.docx";  vardoc = WordApp.Documents.Open( fileName, ReadOnly:false); C# DimWordApp = New Word.ApplicationClass() WordApp.Visible = True DimfileName = "Documento.docx" DimdocAsDocument = _ WordApp.Documents.Open( _ fileName:=fileName, ReadOnly:=True) VB
  • 72. O que é compilado: ApplicationWordApp = (Application) Activator.CreateInstance( Type.GetTypeFromCLSID(newGuid("000209FF-0000-0000-C000-000000000046"))); WordApp.Visible = true; stringfileName = "Documento.docx"; object <>r__ComRefCallLocal0 = fileName; object <>r__ComRefCallLocal1 = false; object <>r__ComRefCallLocal2 = Type.Missing; object <>r__ComRefCallLocal3 = Type.Missing; object <>r__ComRefCallLocal4 = Type.Missing; object <>r__ComRefCallLocal5 = Type.Missing; object <>r__ComRefCallLocal6 = Type.Missing; object <>r__ComRefCallLocal7 = Type.Missing; object <>r__ComRefCallLocal8 = Type.Missing; object <>r__ComRefCallLocal9 = Type.Missing; object <>r__ComRefCallLocala = Type.Missing; object <>r__ComRefCallLocalb = Type.Missing; object <>r__ComRefCallLocalc = Type.Missing; object <>r__ComRefCallLocald = Type.Missing; object <>r__ComRefCallLocale = Type.Missing; object <>r__ComRefCallLocalf = Type.Missing; objectaDoc = WordApp.Documents.Open( ref <>r__ComRefCallLocal0, ref <>r__ComRefCallLocal2, ref <>r__ComRefCallLocal1, ref <>r__ComRefCallLocal3, ref <>r__ComRefCallLocal4, ref <>r__ComRefCallLocal5, ref <>r__ComRefCallLocal6, ref <>r__ComRefCallLocal7, ref <>r__ComRefCallLocal8, ref <>r__ComRefCallLocal9, ref <>r__ComRefCallLocala, ref <>r__ComRefCallLocalb, ref <>r__ComRefCallLocalc, ref <>r__ComRefCallLocald, ref <>r__ComRefCallLocale, ref <>r__ComRefCallLocalf);
  • 73. Mesclando o assembly de interop
  • 76. Variância O que é variância? Define como ocorrem as conversões entre tipos Covariância Permite conversões do mais específico para o mais genérico Contravariância Permite conversões do mais genérico para o mais específico Invariância Permite conversões apenas para o mesmo tipo
  • 77. Conversões Contravariância Covariância A flecha indica a conversão
  • 78. Já temos covariância no C# 3 Em arrays: string[] textos = {}; object[] objetos = textos; De métodos para delegates (no retorno): staticstringRetornaString() {} Func<object> func = RetornaString;
  • 79. Já temos contravariância no C# 3 De métodos para delegates (nos parâmetros): staticvoidRecebeUmObjeto(objectobj) { } Action<string> func3 = RecebeUmObjeto;
  • 80. Mas não há variância entre tipos genéricos no C# 3 IList<string> textos = newList<string>(); IList<object> objetos = textos; Não compila no C# 3.0 Porque... Um botão não é uma string objetos.Add(newButton());
  • 81. Direção do dado Classe de genérico para específico Contravariante de específico para genérico Covariante Dado in out
  • 82. Agora: Variância para tipos e delegates genéricos Covariante: publicinterfaceIEnumerable <out T> : IEnumerable {     IEnumerator<T> GetEnumerator(); } Se consigoenumerarmamíferos, consigoenumeraranimais
  • 83. Agora: Variância para tipos e delegates genéricos Exemplo de uso (covariante): IEnumerable<string> textos = ObterEnumerador();  IEnumerable<object> objetos = textos;
  • 84. Agora: Variância para tipos e delegates genéricos Contravariante: publicinterfaceIComparer<in T>  {      int Compare(T x, T y);  }  Se consigocompararanimais, consigocompararmamíferos
  • 85. Agora: Variância para tipos e delegates genéricos Exemplo de uso (contravariante): IComparer<object> comparadorObjetos; IComparer<string> comparadorStrings = comparadorObjetos;
  • 86. Agora: Variância para tipos e delegates genéricos Covariante e Contravariante: publicdelegate TResultFunc<in T1, in T2, outTResult> (T1 arg1, T2 arg2);
  • 87. Agora: Variância para tipos e delegates genéricos Exemplo de uso (covariante e contravariante):
  • 88. Agora: Variância para tipos e delegates genéricos Exemplo de uso (contravariante): Func<Animal, Macaco> ConverteParaMacaco = animal => { varmacaco = animal asMacaco; if (macaco != null) returnmacaco; returnnull; }; Func<Mamifero, Mamifero> PassaUmMamiferoERetornaUmMamifero = ConverteParaMacaco;
  • 89. Limitações Só tipos de referência (structs e tipos primitivos não são permitidos) Parâmetros out e ref são sempre invariantes Todos esses são inválidos: publicdelegatevoidAlgumDelegate<in T>(ref T valor);publicdelegatevoidAlgumDelegate<out T>(ref T valor); publicdelegatevoidAlgumDelegate<in T>(out T valor); publicdelegatevoidAlgumDelegate<out T>(out T valor);
  • 91. Recursos e links úteis (1) http://tinyurl.com/wccs1 (Webcast MSDN - C# 4 – Parte 1) http://tinyurl.com/wccs2 (Webcast MSDN - C# 4 – Parte 2) http://unplugged.giggio.net/?tag=/c%234 (Giovanni Bassi – MVP) http://renatoguimaraes.spaces.live.com (RenatoGuimarães – MVP)
  • 92. Recursos e links úteis (2) http://msdn.microsoft.com/en-us/vcsharp/dd819407.aspx (C# 4 Resources) http://blogs.msdn.com/ericlippert/ (Eric Lippert - Microsoft) http://blog.fujiy.net/blog/category/Covariancia-e-Contravariancia.aspx (Série do Eric Lippert sobre covariância traduzida pelo Felipe Fujiy) http://blogs.msdn.com/samng/archive/tags/Runtime+binding/default.aspx (Sam NG - Microsoft)
  • 96.
  • 100. .Net Architects: Grupo: http://dotnetarchitects.net Podcast: http://podcast.dotnetarchitects.net Online: http://tinyurl.com/DotNetArch Twitter: #DotNetArchitects Online @