Your SlideShare is downloading. ×
0
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
C#4 – O que há de novo
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

C#4 – O que há de novo

1,928

Published on

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

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
1,928
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
4
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. C#4 – O que há de novo<br />Giovanni Bassigiggio@giggio.net<br />http://giovannibassi.comhttp://unplugged.giggio.net<br />
  • 2. Giovanni Bassi<br /><ul><li>Arquiteto de software
  • 3. Microsoft MVP
  • 4. Consultoria, gestão, mentoring
  • 5. Treinamento
  • 6. C#, VB, J#, F#, IronRuby, etc... (Beta a beta)
  • 7. Dezenas de artigos na .Net Magazine
  • 8. Editor técnico da .Net Magazine
  • 9. Palestrante
  • 10. Professor universitário
  • 11. Líder e fundador do .Net Architects (1º grupo de arquitetura de software com .Net do Brasil)
  • 12. Inetaboardmember</li></li></ul><li><ul><li>Menos de oito meses de vida
  • 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
  • 16. 11 reuniões presenciais até agora
  • 17. Revista a caminho
  • 18. Podcast recentemente liberado
  • 19. Efetivamente um dos maiores e mais ativos grupos do país
  • 20. 100 pessoas presentes no último (e primeiro) evento
  • 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. Blog técnico: http://unplugged.giggio.net
  • 23. Site: http://giovannibassi.com
  • 24. Twitter: @giovannibassi
  • 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. Agenda<br />
  • 27. Ferramental eEvolução<br />
  • 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. Evolução do C#<br />
  • 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. 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. Argumentos opcionais<br />
  • 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. 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. Chamada: como era antes?<br />var elevador = newElevador();<br />elevador.Subir(1,1); //Obrigatório informar<br />
  • 36. Chamada: como é agora?<br />var elevador = newElevador();<br />elevador.Subir();<br />
  • 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. Declaração: como é agora?<br />publicclassElevadorCS<br /> {<br />publicvoid Subir(int andares = 1, <br />int velocidade = 1)<br /> {<br /> }<br /> }<br />
  • 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. 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. Argumentos nomeados<br />
  • 42. Como era antes?<br />var elevador2 = newElevadorCS();<br />elevador2.Subir(2, 3);<br />
  • 43. Como é agora?<br />var elevador2 = newElevadorCS();<br />elevador2.Subir();<br />elevador2.Subir(velocidade: 2);<br />elevador2.Subir(velocidade: 2,andares: 3);<br />
  • 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. Argumentos opcionais e nomeados<br />
  • 46. C# dinâmico<br />
  • 47. Motivação<br />Motivação<br />Hype das linguagens dinâmicas<br />Produtividade<br />Testes<br />Interoperabilidade<br />Extensibilidade<br />
  • 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 &amp;quot;biology&amp;quot;<br /> And there are 3 courses A,B,C that each have &amp;quot;biology&amp;quot; as one of the topics<br /> When I search for &amp;quot;biology&amp;quot;<br /> Then I should see the following courses:<br /> | title |<br /> | A |<br /> | B |<br /> | C |<br />
  • 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. 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. 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(&amp;quot;algumparâmetro&amp;quot;, 3);<br />var d2 = d.AlgumValor();<br />var d3 = ObterVariavelDinamica();<br />
  • 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. 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. 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. 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. 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. 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. Static e DinamicDispatch no Reflector<br />
  • 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. 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. 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. Regra 1<br />A idéia é replicar o comportamento estático, como se as chamadas não fossem dinâmicas<br />
  • 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. Não funcionam<br />Métodos de extensão<br />LINQ (depende de métodos de extensão)<br />
  • 65. C# dinâmico<br />
  • 66. COM Interop<br />
  • 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. Como era antes?<br />ApplicationClassWordApp = newApplicationClass();  <br />WordApp.Visible = true;  <br />objectmissing = System.Reflection.Missing.Value;  <br />objectreadOnly = false;  <br />objectfileName = &amp;quot;Documento.docx&amp;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. Como é no VB?<br />DimWordApp = New Word.ApplicationClass()<br />WordApp.Visible = True<br />DimfileName = &amp;quot;Documento.docx&amp;quot;<br />DimdocAsDocument = _<br />WordApp.Documents.Open( _<br />fileName:=fileName, ReadOnly:=True)<br />
  • 70. Como é agora?<br />varWordApp = newApplicationClass();  <br />WordApp.Visible = true;  <br />stringfileName = &amp;quot;Documento.docx&amp;quot;;  <br />vardoc = WordApp.Documents.Open(<br />fileName, ReadOnly:false);<br />
  • 71. VB e C# lado a lado:<br />varWordApp = newApplicationClass();  <br />WordApp.Visible = true;  <br />stringfileName = &amp;quot;Documento.docx&amp;quot;;  <br />vardoc = WordApp.Documents.Open(<br />fileName, ReadOnly:false);<br />C#<br />DimWordApp = New Word.ApplicationClass()<br />WordApp.Visible = True<br />DimfileName = &amp;quot;Documento.docx&amp;quot;<br />DimdocAsDocument = _<br />WordApp.Documents.Open( _<br />fileName:=fileName, ReadOnly:=True)<br />VB<br />
  • 72. O que é compilado:<br />ApplicationWordApp = (Application) Activator.CreateInstance(<br />Type.GetTypeFromCLSID(newGuid(&amp;quot;000209FF-0000-0000-C000-000000000046&amp;quot;)));<br />WordApp.Visible = true;<br />stringfileName = &amp;quot;Documento.docx&amp;quot;;<br />object &amp;lt;&amp;gt;r__ComRefCallLocal0 = fileName;<br />object &amp;lt;&amp;gt;r__ComRefCallLocal1 = false;<br />object &amp;lt;&amp;gt;r__ComRefCallLocal2 = Type.Missing;<br />object &amp;lt;&amp;gt;r__ComRefCallLocal3 = Type.Missing;<br />object &amp;lt;&amp;gt;r__ComRefCallLocal4 = Type.Missing;<br />object &amp;lt;&amp;gt;r__ComRefCallLocal5 = Type.Missing;<br />object &amp;lt;&amp;gt;r__ComRefCallLocal6 = Type.Missing;<br />object &amp;lt;&amp;gt;r__ComRefCallLocal7 = Type.Missing;<br />object &amp;lt;&amp;gt;r__ComRefCallLocal8 = Type.Missing;<br />object &amp;lt;&amp;gt;r__ComRefCallLocal9 = Type.Missing;<br />object &amp;lt;&amp;gt;r__ComRefCallLocala = Type.Missing;<br />object &amp;lt;&amp;gt;r__ComRefCallLocalb = Type.Missing;<br />object &amp;lt;&amp;gt;r__ComRefCallLocalc = Type.Missing;<br />object &amp;lt;&amp;gt;r__ComRefCallLocald = Type.Missing;<br />object &amp;lt;&amp;gt;r__ComRefCallLocale = Type.Missing;<br />object &amp;lt;&amp;gt;r__ComRefCallLocalf = Type.Missing;<br />objectaDoc = WordApp.Documents.Open(<br />ref &amp;lt;&amp;gt;r__ComRefCallLocal0, ref &amp;lt;&amp;gt;r__ComRefCallLocal2, <br />ref &amp;lt;&amp;gt;r__ComRefCallLocal1, ref &amp;lt;&amp;gt;r__ComRefCallLocal3, <br />ref &amp;lt;&amp;gt;r__ComRefCallLocal4, ref &amp;lt;&amp;gt;r__ComRefCallLocal5, <br />ref &amp;lt;&amp;gt;r__ComRefCallLocal6, ref &amp;lt;&amp;gt;r__ComRefCallLocal7, <br />ref &amp;lt;&amp;gt;r__ComRefCallLocal8, ref &amp;lt;&amp;gt;r__ComRefCallLocal9,<br />ref &amp;lt;&amp;gt;r__ComRefCallLocala, ref &amp;lt;&amp;gt;r__ComRefCallLocalb, <br />ref &amp;lt;&amp;gt;r__ComRefCallLocalc, ref &amp;lt;&amp;gt;r__ComRefCallLocald, <br />ref &amp;lt;&amp;gt;r__ComRefCallLocale, ref &amp;lt;&amp;gt;r__ComRefCallLocalf);<br />
  • 73. Mesclando o assembly de interop<br />
  • 74. Com interop<br />
  • 75. Variância<br />
  • 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. Conversões<br />Contravariância<br />Covariância<br />A flecha indica a conversão<br />
  • 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&amp;lt;object&amp;gt; func = RetornaString;<br />
  • 79. Já temos contravariância no C# 3<br />De métodos para delegates (nos parâmetros):<br />staticvoidRecebeUmObjeto(objectobj) { }<br /> Action&amp;lt;string&amp;gt; func3 = RecebeUmObjeto;<br />
  • 80. Mas não há variância entre tipos genéricos no C# 3<br />IList&amp;lt;string&amp;gt; textos = newList&amp;lt;string&amp;gt;();<br />IList&amp;lt;object&amp;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. 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. Agora: Variância para tipos e delegates genéricos<br />Covariante:<br />publicinterfaceIEnumerable &amp;lt;out T&amp;gt;<br />: IEnumerable<br />{<br />    IEnumerator&amp;lt;T&amp;gt; GetEnumerator();<br />}<br />Se consigoenumerarmamíferos, <br />consigoenumeraranimais<br />
  • 83. Agora: Variância para tipos e delegates genéricos<br />Exemplo de uso (covariante):<br />IEnumerable&amp;lt;string&amp;gt; textos = ObterEnumerador();  <br />IEnumerable&amp;lt;object&amp;gt; objetos = textos;<br />
  • 84. Agora: Variância para tipos e delegates genéricos<br />Contravariante:<br />publicinterfaceIComparer&amp;lt;in T&amp;gt;  <br />{  <br />    int Compare(T x, T y);  <br />}  <br />Se consigocompararanimais, <br />consigocompararmamíferos<br />
  • 85. Agora: Variância para tipos e delegates genéricos<br />Exemplo de uso (contravariante):<br />IComparer&amp;lt;object&amp;gt; comparadorObjetos;<br />IComparer&amp;lt;string&amp;gt; comparadorStrings = comparadorObjetos;<br />
  • 86. Agora: Variância para tipos e delegates genéricos<br />Covariante e Contravariante:<br />publicdelegate<br />TResultFunc&amp;lt;in T1, in T2, outTResult&amp;gt;<br /> (T1 arg1, T2 arg2);<br />
  • 87. Agora: Variância para tipos e delegates genéricos<br />Exemplo de uso (covariante e contravariante):<br />
  • 88. Agora: Variância para tipos e delegates genéricos<br />Exemplo de uso (contravariante):<br />Func&amp;lt;Animal, Macaco&amp;gt; ConverteParaMacaco =<br /> animal =&amp;gt;<br /> {<br />varmacaco = animal asMacaco;<br />if (macaco != null)<br />returnmacaco;<br />returnnull;<br /> };<br />Func&amp;lt;Mamifero, Mamifero&amp;gt; PassaUmMamiferoERetornaUmMamifero = <br />ConverteParaMacaco;<br />
  • 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&amp;lt;in T&amp;gt;(ref T valor);publicdelegatevoidAlgumDelegate&amp;lt;out T&amp;gt;(ref T valor);<br />publicdelegatevoidAlgumDelegate&amp;lt;in T&amp;gt;(out T valor);<br />publicdelegatevoidAlgumDelegate&amp;lt;out T&amp;gt;(out T valor);<br />
  • 90. variância<br />
  • 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. 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. Revista<br />
  • 94. Dúvidas<br />?<br />
  • 95. Obrigado!<br /><br />
  • 96. <ul><li>Email: giggio@giggio.net
  • 97. Blog técnico: http://unplugged.giggio.net
  • 98. Site: http://giovannibassi.com
  • 99. Twitter: @giovannibassi
  • 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 />

×