6. Evento Palestras: Programando com prazer com DomainDriven Design (DDD) Utilizando Injeção de dependência com Unity (Enterprise Library) ASP.Net MVC: tome seu HTML de volta ORM - Sendo preguiçoso com Nhibernate Testes: garantindo que seu código faz o que você quer Data: 27/Junho Local: Unip Tatuapé - São Paulo/SP Valor: R$ 50 http://dotnetarchitects.net/dnad2009
8. 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...)
9. 4 novidades Construções dinâmicas Argumentos opcionais e argumentos nomeados Variância para tipos genéricos Melhorias na interoperabilidade com o COM
10. 4 novidades Webcast da parte 1 Dia 04/6 Construções dinâmicas Argumentos opcionais e argumentos nomeados Variância para tipos genéricos Melhorias na interoperabilidade com o COM
11. 4 novidades Construções dinâmicas Argumentos opcionais e argumentos nomeados Variância para tipos genéricos Melhorias na interoperabilidade com o COM Agora!
13. COM Interop 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
15. COM Interop Como é no VB? DimWordApp = New Word.ApplicationClass() WordApp.Visible = True DimfileName = "Documento.docx" DimdocAsDocument = _ WordApp.Documents.Open( _ fileName:=fileName, ReadOnly:=True)
16. COM Interop Como é agora? var WordApp = newApplicationClass(); WordApp.Visible = true; stringfileName = "Documento.docx"; vardoc = WordApp.Documents.Open( fileName, ReadOnly:false);
17. COM Interop VB e C# lado a lado: var WordApp = 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
23. 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
25. Variância 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;
26. Variância Já temos contravariância no C# 3: De métodos para delegates (nos parâmetros): staticvoidRecebeUmObjeto(objectobj) { } Action<string> func3 = RecebeUmObjeto;
27. Variância 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
28. Variância Porque não? IList<string> textos = newList<string>(); IList<object> objetos = textos; objetos.Add(newButton()); Um botão não é uma string
29. Variância Mas assim funciona... objetos[0] = newButton(); Perigo em tempo de execução Além do perigo, checagemem tempo de execução causa overhead
32. Variância Classe de genérico para específico Contravariante de específico para genérico Covariante Dado
33. Variância Classe de genérico para específico Contravariante de específico para genérico Covariante Dado in out
34. Variância Agora: Variância para tipos e delegates genéricos Covariante: publicinterfaceIEnumerable <out T> : IEnumerable { IEnumerator<T> GetEnumerator(); }
35. Variância Agora: Variância para tipos e delegates genéricos Covariante: publicinterfaceIEnumerable <out T> : IEnumerable { IEnumerator<T> GetEnumerator(); } Se consigoenumerarmamíferos, consigoenumeraranimais
36. Variância Agora: Variância para tipos e delegates genéricos Exemplo de uso (covariante): IEnumerable<string> textos = ObterEnumerador(); IEnumerable<object> objetos = textos;
37. Variância Agora: Variância para tipos e delegates genéricos Contravariante: publicinterfaceIComparer<in T> { int Compare(T x, T y); }
38. Variância Agora: Variância para tipos e delegates genéricos Contravariante: publicinterfaceIComparer<in T> { int Compare(T x, T y); } Se consigocompararanimais, consigocompararmamíferos
39. Variância Agora: Variância para tipos e delegates genéricos Exemplo de uso (contravariante): IComparer<object> comparadorObjetos; IComparer<string> comparadorStrings = comparadorObjetos;
40. Variância Agora: Variância para tipos e delegates genéricos Covariante e Contravariante: publicdelegate TResultFunc<in T1, in T2, outTResult> (T1 arg1, T2 arg2);
41. Variância Agora: Variância para tipos e delegates genéricos Covariante e Contravariante: publicdelegate TResultFunc<in T1, in T2, outTResult> (T1 arg1, T2 arg2);
42. Variância Agora: Variância para tipos e delegates genéricos Exemplo de uso (covariante e contravariante):
43. Variância 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;
44. Variância 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);