C#4 – O que há de novo

2,198 views

Published on

Entenda o que há de novo no C# 4.

Published in: Technology, Education
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,198
On SlideShare
0
From Embeds
0
Number of Embeds
1,034
Actions
Shares
0
Downloads
0
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

C#4 – O que há de novo

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

×