as novidades do c# 4.0 - netponto

48
As Novidades Do C#

Upload: paulo-morgado

Post on 18-May-2015

2.623 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: As Novidades Do C# 4.0 - NetPonto

As Novidades Do C#

Page 3: As Novidades Do C# 4.0 - NetPonto

• A Evolução ao C#• Covariância e Contravariância• Argumentos com Nome e Opcionais• Programação Dinâmica• Melhoramentos na

Interoperabilidade com COM

Agenda

Page 4: As Novidades Do C# 4.0 - NetPonto

A Evolução do C#

Page 5: As Novidades Do C# 4.0 - NetPonto

C# 1.0Managed

C# 2.0Genericos

C# 3.0LINQ

A Evolução do C#

Page 6: As Novidades Do C# 4.0 - NetPonto

Tendências

Declarativa

ConcorrenteDinâmica

Page 7: As Novidades Do C# 4.0 - NetPonto

Dinâmico vs. Estático

Linguagens Dinâmicas

Simplicidade e concisão

Implicitamente tipadas

Meta-programação

Sem compilação

Linguagens Estáticas

Robustez

PerformanceFerramentas inteligentes

Melhor escalabilidade

Page 8: As Novidades Do C# 4.0 - NetPonto

VB

C#C# VB

Co-Evolução• Argumentos

com nome• Argumentos

opcionais• Propriedades

indexadas (COM)

• Instrucções Lambda

• Propriedades auto-implementadas

• Inicializadores de colecções

Page 9: As Novidades Do C# 4.0 - NetPonto

C# 1.0Managed

C# 2.0Genericos

C# 3.0LINQ

C# 4.0Programação Dinâmica

A Evolução do C#

Page 11: As Novidades Do C# 4.0 - NetPonto

Covariância e Contravariância

Page 12: As Novidades Do C# 4.0 - NetPonto

Em álgebra multilinear, covariância e contravariância descrevem como a descrição quantitativa de certas entidades geométricas ou físicas variam quando passam de um sistema de coordenadas para outro.

Wikipedia

Covariância e Contravariância

Page 13: As Novidades Do C# 4.0 - NetPonto

O tipo T é maior (>) que o tipo S se S é um subtipo (deriva) de T

Covariância e Contravariância

T ≥ Stypeof(T).IsAssignableFrom(typeof(S))

Page 14: As Novidades Do C# 4.0 - NetPonto

• Dados 2 tipos Base e Derivado, em que:• Existe uma conversão por referência (ou identidade) entre

Base e Derivado• Base ≥ Derived

• Uma definição de tipo genérico Genérico<T> é:• Covariante em T

• Se Genérico<Base> ≥ Genérico<Derivado>

• Contravariante em T• Se Genérico<Base> ≤ Genérico<Derivado>

• Invariante em T• Se nenhuma das regras anteriores se aplica

Covariância e Contravariância

Page 15: As Novidades Do C# 4.0 - NetPonto

Contravariante em Ttypeof(Base).IsAssignableFrom(typeof(Derivado))

typeof(G<Derivado>).IsAssignableFrom(typeof(G<Base>))

Covariante em Ttypeof(Base).IsAssignableFrom(typeof(Derivado))

typeof(G<Base>).IsAssignableFrom(typeof(G<Derivado>))

Covariância e Contravariância

Page 16: As Novidades Do C# 4.0 - NetPonto

Covariância e Contravariância

string[] strings = GetStringArray();Process(strings);

void Process(object[] objects){ objects[0] = "Hello"; // Ok objects[1] = new Button(); // Exception!}

Em C# (.NET), os arrays são covariantes

…mas não são covariantes seguros

void Process(object[] objects) { … }

Page 17: As Novidades Do C# 4.0 - NetPonto

Covariância e Contravariância

List<string> strings = GetStringList();Process(strings);

Até agora, no C# (.NET), os genéricos têm

sido invariantes

void Process(IEnumerable<object> objects){ // IEnumerable<T> é apenas de leitura // portanto é covariante seguro}

O C# 4.0 suporta

covariância e contravariância

segura

void Process(IEnumerable<object> objects) { … }

Page 18: As Novidades Do C# 4.0 - NetPonto

Covariância Segura

public interface IEnumerable<T>{ IEnumerator<T> GetEnumerator();}

public interface IEnumerator<T>{ T Current { get; } bool MoveNext();}

public interface IEnumerable<out T>{ IEnumerator<T> GetEnumerator();}public interface IEnumerator<out T>{ T Current { get; } bool MoveNext();}

out = covarianteapenas em posições de

saída

IEnumerable<string> strings = GetStrings();IEnumerable<object> objects = strings;

Pode ser tratado comomenos derivado

Page 19: As Novidades Do C# 4.0 - NetPonto

Contravariância Segura

public interface IComparer<T>{ int Compare(T x, T y);}

public interface IComparer<in T>{ int Compare(T x, T y);} IComparer<object> objComp =

GetComparer();IComparer<string> strComp = objComp;

in = contravarianteapenas em posições de

entrada

Pode ser tratado como mais derivado

Page 20: As Novidades Do C# 4.0 - NetPonto

• Suportada apenas para interfaces genéricas e delegates genéricos.

• Verificada/forçada estáticamente a partir da definição.• Tipos valor são sempre invariantes

• Um IEnumerable<int> não é um IEnumerable<object>• A regra para arrays é similar

• Parâmetros ref e out necessitam tipos parâmetros invariantes

Variância em C# 4.0

Page 21: As Novidades Do C# 4.0 - NetPonto

Interfaces

• System.Collections.Generic.IEnumerable<out T>• System.Collections.Generic.IEnumerator<out T>• System.Linq.IQueryable<out T>• System.Collections.Generic.IComparer<in T>• System.Collections.Generic.IEqualityComparer<in T>• System.IComparable<in T>

Delegates

• System.Func<in T, …, out R>• System.Action<in T, …>• System.Predicate<in T>• System.Comparison<in T>• System.EventHandler<in T>

Variância em .NET 4.0

Page 22: As Novidades Do C# 4.0 - NetPonto

• Covariância E Contravariância Em Genéricos• http://paulomorgado.net/pt/blog/archive/2010/04/13/c-4-0-covari-226-ncia-e-contravari-

226-ncia-em-gen-233-ricos.aspx

• Covariância E Contravariância Em Genéricos – Simplificado• http://paulomorgado.net/pt/blog

/archive/2010/04/15/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos-simplificado.aspx

• Covarince and Contravariance in Generics• http://msdn.microsoft.com/library/dd799517(VS.100).aspx

• Exact rules for variance validity• http://blogs.msdn.com/ericlippert/archive/2009/12/03/exact-rules-for-variância-validity.aspx

• Events get a little overhaul in C# 4, Afterward: Effective Events• http://

blogs.msdn.com/cburrows/archive/2010/03/30/events-get-a-little-overhaul-in-c-4-afterward-effective-events.aspx

Recursos

Page 23: As Novidades Do C# 4.0 - NetPonto

Argumentos com Nome e Opcionais

Page 24: As Novidades Do C# 4.0 - NetPonto

Argumentos com Nome e Opcionais

Greeting("Mr.", "Morgado", 42);

public void Greeting(string title, string name, int age)

Argumentos

Parâmetros

Têm sempre nome

Nunca são opcionais

Page 25: As Novidades Do C# 4.0 - NetPonto

Argumentos com Nome

int i = 0;Method(i, third: i++, second: ++i);

public void Method(int first, int second, int third)

int i = 0;int CS$0$0000 = i++;int CS$0$0001 = ++i;Method(i, CS$0$0001, CS$0$0000);

Page 26: As Novidades Do C# 4.0 - NetPonto

Argumentos Opcionais

int i = 0;Method(i, third: ++i);

public void Method(int first, int second = 2, int third = 3) public void Method(int first, int second = 5, int third = 6)

public void Method(int first)

int i = 0;int CS$0$0000 = ++i;Method(i, 2, CS$0$0000);

public void Method(int first, int second)

Parecem sobreposições (overloads)

Mas não

são!

Page 27: As Novidades Do C# 4.0 - NetPonto

• Classes de Argumentos

Argumentos Opcionais - Alternativa

XmlReaderSettings settings = new XmlReaderSettings();settings.ValidationType = ValidationType.Auto;XmlReader.Create("file.xml", settings);

XmlReader.Create( "file.xml", new XmlReaderSettings { ValidationType = ValidationType.Auto });

XmlReader.Create( "file.xml", new { ValidationType = ValidationType.Auto }); Ainda

não!

Page 28: As Novidades Do C# 4.0 - NetPonto

• Argumentos Com Nome E Opcionais• http://paulomorgado.net/pt/blog/archive/2010/04/16/c-4-0-argumentos-com

-nome-e-opcionais.aspx

• Alternativa Aos Argumentos Opcionais• http://paulomorgado.net/pt/blog/archive/2010/04/18/c-4-0-alternativa-aos-a

rgumentos-opcionais.aspx

• Named and Optional Arguments (C# Programming Guide)• http://msdn.microsoft.com/library/dd264739(VS.100).aspx

Recursos

Page 29: As Novidades Do C# 4.0 - NetPonto

Programação Dinâmica

Page 30: As Novidades Do C# 4.0 - NetPonto

Dynamic Language Runtime

PythonBinder

RubyBinder

COMBinder

JavaScript

Binder

ObjectBinder

Dynamic Language RuntimeExpression Trees

Dynamic Dispatch

Call Site Caching

IronPython

IronRuby C# VB.NET Others…

Page 31: As Novidades Do C# 4.0 - NetPonto

Objectos Tipados Dinâmicamente

Calculator calculator = GetCalculator();int sum = calc.Add(10, 20);object calculator = GetCalculator();

Type calculatorType = calculator.GetType();object res = calculatorType.InvokeMember("Add", BindingFlags.InvokeMethod, null, calculator, new object[] { 10, 20 });int sum = Convert.ToInt32(res);

ScriptObject calculator = GetCalculator();object res = calculator.Invoke("Add", 10, 20);int sum = Convert.ToInt32(res);

dynamic calc = GetCalculator();int sum = calc.Add(10, 20);

Estaticamente tipado para ser

dinâmico

Invocação de método

dinâmica

Conversão dinâmica

Page 32: As Novidades Do C# 4.0 - NetPonto

Objectos Tipados Dinâmicamente

dynamic x = 1;dynamic y = "Hello";dynamic z = new List<int> { 1, 2, 3 };

dynamic em tempo de

compilação

System.Int32 em tempo de

execução

Quando os operandos são dynamic:• A selecção do membro é diferida para tempo de execução• Em tempo de execução, os tipos reais são substituídos por dynamic• O resultado estático da operação é dynamic

Page 33: As Novidades Do C# 4.0 - NetPonto

Objectos Tipados Dinâmicamente

public static class Math{ public static decimal Abs(decimal value); public static double Abs(double value); public static float Abs(float value); public static int Abs(int value); public static long Abs(long value); public static sbyte Abs(sbyte value); public static short Abs(short value); ...}

double x = 1.75;double y = Math.Abs(x);

dynamic x = 1.75;dynamic y = Math.Abs(x);

Método seleccionado em tempo de compilação:

double Abs(double x)

Método seleccionado em

tempo de execução:double

Abs(double x)

dynamic x = 2;dynamic y = Math.Abs(x);

Método seleccionado em

tempo de execução:

int Abs(int x)

Page 34: As Novidades Do C# 4.0 - NetPonto

• IDynamicMetaObjectProvider• Representa um objecto dinâmico que pode ter operações

determinadas em tempo de execução.

• DynamicObject : IDynamicMetaObjectProvider• Permite definir o comportamento do objecto dinâmico

quando se pretende executar uma operação.

• ExpandoObject : IDynamicMetaObjectProvider• Objecto que permite que lhe sejam adicionados e

removidos membros.

Construção de Objectos Dinâmicos

Page 35: As Novidades Do C# 4.0 - NetPonto

• Programação Dinâmica• http://paulomorgado.net/pt/blog/archive/2010/04/18/c-4-0-programa-231-227-o-din-2

26-mica.aspx

• Proposta C#: Verificação Estática De Objectos Dinâmicos Em Tempo De Compilação• http://

paulomorgado.net/pt/blog/archive/2010/03/17/proposta-c-verifica-231-227-o-est-225-tica-de-objectos-din-226-micos-em-tempo-de-compila-231-227-o.aspx

• Using Type dynamic (C# Programming Guide)• http://msdn.microsoft.com/library/dd264736(VS.100).aspx

• Dynamic Language Runtime Overview• http://msdn.microsoft.com/library/dd233052(v=VS.100).aspx

Recursos

Page 36: As Novidades Do C# 4.0 - NetPonto

Melhoramentos na Interoperabilidade com COM

Page 37: As Novidades Do C# 4.0 - NetPonto

• Argumentos com nome e opcionais• Omissão do Modificador ref• Importação Dinâmica• Mapeamento automático object → dynamic• Propriedades indexadas

• Equivalência de Tipos e Tipos Embebidos (“NO PIA”)

Melhoramentos na Interoperabilidade com COM

Page 38: As Novidades Do C# 4.0 - NetPonto

Omissão do Modificador ref

object fileName = "Test.docx";object missing = Missing.Value;

document.SaveAs(ref fileName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);

document.SaveAs("Test.docx", Missing.Value,  Missing.Value, Missing.Value, Missing.Value,  Missing.Value, Missing.Value, Missing.Value,  Missing.Value, Missing.Value, Missing.Value,  Missing.Value, Missing.Value, Missing.Value,  Missing.Value, Missing.Value);

document.SaveAs("Test.docx");

Page 39: As Novidades Do C# 4.0 - NetPonto

Importação Dinâmica

((Excel.Range)(excel.Cells[1, 1])).Value2 = "Hello World!";

excel.Cells[1, 1] = "Hello World!";

Excel.Range range = (Excel.Range)(excel.Cells[1, 1]);

Excel.Range range = excel.Cells[1, 1];

Page 40: As Novidades Do C# 4.0 - NetPonto

Equivalência de Tipos e Tipos Embebidos (NO PIA)

Page 42: As Novidades Do C# 4.0 - NetPonto

Demos

Page 43: As Novidades Do C# 4.0 - NetPonto

Q & A

Page 44: As Novidades Do C# 4.0 - NetPonto

Conclusão

Page 45: As Novidades Do C# 4.0 - NetPonto

• A Evolução ao C#• Covariância e Contravariância• Argumentos com Nome e Opcionais• Programação Dinâmica• Melhoramentos na

Interoperabilidade com COM

Conclusão

Page 46: As Novidades Do C# 4.0 - NetPonto

• Visual C# Developer Center• http://csharp.net/

• Visual C# 2010 Samples• http://code.msdn.microsoft.com/cs2010samples

• C# Language Specification 4.0• http://www.microsoft.com/downloads/details.aspx?familyid=

DFBF523C-F98C-4804-AFBD-459E846B268E&displaylang=en

Recursos

Page 47: As Novidades Do C# 4.0 - NetPonto

• .NET Reflector• http://www.red-gate.com/products/reflector/

• LINQPad• http://linqpad.net/

• Paulo Morgado• http://PauloMorgado.NET/

Recursos

Page 48: As Novidades Do C# 4.0 - NetPonto

Obrigado!