C#4 - Parte 2 - COM interop e variância

1,816 views
1,718 views

Published on

Apresentação do webcast MSDN sobre C# 4.
Parte 2
Apresentando COM Interop e variância (Covariância e contravariância)

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

  • Be the first to like this

No Downloads
Views
Total views
1,816
On SlideShare
0
From Embeds
0
Number of Embeds
370
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

C#4 - Parte 2 - COM interop e variância

  1. 1. ASP.NET MVC – C#4 – COM Interop e Variância<br />Giovanni Bassi<br />giggio@giggio.net<br />blog: http://unplugged.giggio.net<br />
  2. 2. Online @<br /><ul><li>Email: giggio@giggio.net
  3. 3. Blog técnico: http://unplugged.giggio.net
  4. 4. Site: http://giovannibassi.com
  5. 5. .Net Architects: </li></ul>Grupo: http://dotnetarchitects.net <br />Online: http://tinyurl.com/DotNetArch<br />
  6. 6. Evento<br />Palestras:<br />Programando com prazer com DomainDriven Design (DDD)<br />Utilizando Injeção de dependência com Unity (Enterprise Library)<br />ASP.Net MVC: tome seu HTML de volta<br />ORM - Sendo preguiçoso com Nhibernate<br />Testes: garantindo que seu código faz o que você quer<br />Data: 27/Junho<br />Local: Unip Tatuapé - São Paulo/SP<br />Valor: R$ 50<br />http://dotnetarchitects.net/dnad2009<br />
  7. 7. Agenda<br />
  8. 8. 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 />
  9. 9. 4 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 />
  10. 10. 4 novidades<br />Webcast da parte 1<br />Dia 04/6<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 />
  11. 11. 4 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 />Agora!<br />
  12. 12. COM Interop<br />
  13. 13. COM Interop<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 />
  14. 14. COM Interop<br />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 />
  15. 15. COM Interop<br />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 />
  16. 16. COM Interop<br />Como é agora?<br />var WordApp = newApplicationClass();  <br />WordApp.Visible = true;  <br />stringfileName = &quot;Documento.docx&quot;;  <br />vardoc = WordApp.Documents.Open(<br />fileName, ReadOnly:false);<br />
  17. 17. COM Interop<br />VB e C# lado a lado:<br />var WordApp = 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 />
  18. 18. COM Interop<br />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 />
  19. 19. COM Interop<br />Mesclando o assembly de interop<br />
  20. 20. Demo<br />Demo<br />COM Interop<br />
  21. 21. Dúvidasatéaqui?<br />
  22. 22. Variância<br />
  23. 23. 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 />
  24. 24. Variância<br />Contravariância<br />Covariância<br />A flecha indica a conversão<br />
  25. 25. Variância<br />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 />
  26. 26. Variância<br />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 />
  27. 27. Variância<br />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 />
  28. 28. Variância<br />Porque não?<br />IList&lt;string&gt; textos = newList&lt;string&gt;();<br />IList&lt;object&gt; objetos = textos;<br />objetos.Add(newButton());<br />Um botão não é uma string<br />
  29. 29. Variância<br />Mas assim funciona...<br />objetos[0] = newButton();<br />Perigo em tempo de execução<br />Além do perigo, <br />checagemem<br />tempo de execução<br />causa overhead<br />
  30. 30. Dúvidasatéaqui?<br />
  31. 31. Variância<br />Classe<br />Contravariante<br />Covariante<br />Dado<br />
  32. 32. Variância<br />Classe<br />de genérico para específico<br />Contravariante<br />de específico para genérico<br />Covariante<br />Dado<br />
  33. 33. Variância<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 />
  34. 34. Variância<br />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 />
  35. 35. Variância<br />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 />
  36. 36. Variância<br />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 />
  37. 37. Variância<br />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 />
  38. 38. Variância<br />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 />
  39. 39. Variância<br />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 />
  40. 40. Variância<br />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 />
  41. 41. Variância<br />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 />
  42. 42. Variância<br />Agora: Variância para tipos e delegates genéricos<br />Exemplo de uso (covariante e contravariante):<br />
  43. 43. Variância<br />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 />
  44. 44. Variância<br />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 />
  45. 45. Demo<br />Demo<br />Variância<br />
  46. 46. Revista<br />
  47. 47. http://msdn.microsoft.com/en-us/vcsharp/dd819407.aspx (C# 4 Resources) http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx (Eric Lippert - Microsoft)=&gt; Traduzidopelo Felipe Fujiy: http://blog.fujiy.net/blog/category/Covariancia-e-Contravariancia.aspxhttp://unplugged.giggio.net/unplugged/?tag=/c%234 (Giovanni Bassi - MVP)http://renatoguimaraes.spaces.live.com (RenatoGuimarães – MVP)<br />
  48. 48. Dúvidas?<br />
  49. 49. Online @<br /><ul><li>Email: giggio@giggio.net
  50. 50. Blog técnico: http://unplugged.giggio.net
  51. 51. Site: http://giovannibassi.com
  52. 52. .Net Architects: </li></ul>Grupo: http://dotnetarchitects.net <br />Online: http://tinyurl.com/DotNetArch<br />
  53. 53. Obrigado<br />Giovanni Bassi<br />giggio@giggio.net<br />blog: http://unplugged.giggio.net<br />

×