.NET 4.0 a fondo Pablo Zaidenvoren Max Déboli Rodolfo Finochietti MVP – Client App Dev LAGASH SYSTEMS Agenda • • • • • • La evolución de C# Dinámico vs Estático Dinámico vs Estático Innovaciones en C# 4 Code Contracts Paralelismo y concurrencia Paralelismo y concurrencia ¡Muchas Demos! La evolución de C# C# 4.0 C# 3 0 C# 3.0 C# 2.0 C# 1 0 C# 1.0 Programación dinámica Concurrencia Code Contracts LINQ Generics Código Manejado Dinámico vs Estático Dinámico vs. Estático Lenguajes Dinámicos Lenguajes Estáticos Simples and sucintos Robustos Tipos implícitos Performantes Meta‐programación Herramientas inteligentes Sin compilación Escalan mejor Programación dinámica en NET Programación dinámica en .NET IronPython IronRuby C# VB.NET Others… Dynamic Language Runtime Expression Trees Expression Trees Object j Binder JavaScript p Binder Dynamic Dispatch Dynamic Dispatch Python y Binder Call Site Caching Call Site Caching Rubyy Binder COM Binder Objetos tipados dinámicamente Objetos tipados dinámicamente Calculator calc calc = GetCalculator(); GetCalculator(); int sum = calc.Add(10, 20); object j calc = GetCalculator(); (); Type calcType = calc.GetType(); object res = calcType.InvokeMember("Add", BindingFlags.InvokeMethod, null, new object[] { 10, 20 }); bj t[] { 10 20 }) ScriptObject calc = GetCalculator(); int sum = Convert.ToInt32(res); object res = calc.Invoke("Add", 10, 20); int sum = Convert.ToInt32(res); Tipado Ti d estáticamente como dynamic dynamic calc = GetCalculator(); int sum = calc.Add(10, 20); Conversión dinámica Método invocado dinámicamente Objetos tipados dinámicamente Objetos tipados dinámicamente Tipo en tiempo de compilación: dynamic Tipo en tiempo de ejecución: System.Int32 dynamic x = 1; dynamic y y = "Hello"; y ; dynamic z = new List<int> { 1, 2, 3 }; Cuando los operadores son dynamic… • La selección de miembros se hace en run‐time • En run‐time los tipos dynamic son sustituidos a los tipos reales En run time los tipos dynamic son sustituidos a los tipos reales • Cualquier resultado producto de un tipo dynamic es tipado como dynamic y •“dynamic es como object pero mas copado” Objetos tipados dinámicamente Objetos tipados dinámicamente public static class Math { public static decimal Abs(decimal value); public static double Abs(double value); El método se elije en El método se elije en public bli static i float fl Abs(float b (fl value); l ) tiempo de public static int Abs(int value); compilación: public static long Abs(long value); double Abs(double ( x)) public static sbyte Abs(sbyte value); public static short Abs(short value); ... double x = 1.75; El método se elije en } double y = Math.Abs(x); y = Math Abs(x); run‐time: i double Abs(double x) dynamic x = 1.75; dynamic y = Math.Abs(x); dynamic x = 2; dynamic y = Math.Abs(x); dynamic y Math.Abs(x); El método se elije en run‐time: int Abs(int x) DEMO Objetos tipados dinámicamente System Dynamic DynamicObject System.Dynamic.DynamicObject public class DynamicObject : IDynamicMetaObjectProvider { protected DynamicObject(); public virtual IEnumerable<string> GetDynamicMemberNames(); public virtual DynamicMetaObject GetMetaObject(Expression parameter); public virtual bool TryBinaryOperation(BinaryOperationBinder binder, object arg, out object result); public virtual bool TryConvert(ConvertBinder binder, out object result); public virtual bool TryCreateInstance(CreateInstanceBinder binder, object[] args, out object result); public virtual bool TryDeleteIndex(DeleteIndexBinder binder, object[] indexes); public virtual bool TryDeleteMember(DeleteMemberBinder binder); public virtual bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result); lt) public virtual bool TryGetMember(GetMemberBinder binder, out object result); public virtual bool TryInvoke(InvokeBinder binder, object[] args, out object result); public virtual bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out binder object[] args out object result); public virtual bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value); public virtual bool TrySetMember(SetMemberBinder binder, object value); public virtual bool TryUnaryOperation(UnaryOperationBinder binder, out object result); } DEMO DynamicObject Code Contracts Code Contracts Code Contracts Code Contracts ‐Intentan I t t resolver el gap l l entre el lenguaje t ll j coloquial l i l y el l mundo del software. ‐Posibilidad de expresar condiciones que mi programa siempre i d b á cumplir. deberá li ‐Pre‐condiciones P di i (R i ) (Requires) ‐Post‐Condiciones P t C di i (E (Ensures) ) ‐Invariantes I i t de tipo d ti (Invariants) (I i t) DEMO Code Contracts Serial vs Paralela Ejecución Serial vs. Paralela Serial Paralela Problema dividido en ejecución secuencial de instrucciones Problema dividido en partes que se resuelven concurrentemente Sólo una instrucción por vez Múltiples instrucciones en simultáneo Recursos exclusivos Recursos compartidos Mayor disponibilidad de los recuros Mayor uso de los recursos Mayor uso de los recursos Ejecución Serial vs. Paralela Serial vs Paralela Escenario 1: ‐ Un proceso Un proceso utiliza un procesador, como un procesador, como un todo un todo Escenario 2: ‐ Un proceso utiliza un procesador, pudiendo repartirse epa se eentre sus e sus nucleos uc eos Escenario 3: ‐ Un proceso distribuye la carga dinámicamente entre los procesadores p y nucleos disponibles p ((ideal!)) TPL + PLINQ es la solución! TPL + PLINQ es la solución! Data Parallelism Data Parallelism Colección Elemento 1 P0 P1 S0 P2 Elemento 2 P3 … I Elemento N DEMO Parallel.For() / Parallel.ForEach() Task Parallel Library Task Parallel Library ‐API de alto nivel API de alto nivel para desarrollo paralelo y multi‐ multi thread ‐Librería montada sobre el API existente de System Threading System.Threading ‐Aprovecha las nuevas herramientas del lenguaje del lenguaje ‐Abstrae al programador al programador de utilizar de utilizar primitivas de de sincronización ‐Posibilidad de escalar dinámicamente! Task Parallelism Task Parallelism Ejecución de diferentes tareas en forma concurrente P0 P1 S0 P2 P3 Task Parallelism Task Parallelism Implícitas Explícitas DEMO Tasks + Herramientas de diagnóstico en paralelo Parámetros opcionales Parámetros opcionales public StreamReader OpenTextFile( string path, Encoding encoding, bool detectEncoding, g, int bufferSize); public bli StreamReader St d O OpenTextFile( t il ( string path, Encoding encoding, bool detectEncoding); public StreamReader OpenTextFile( string path, E Encoding di encoding); di ) public StreamReader OpenTextFile( string g p path); ); Método primario p Overloads secundarios d i Llamada al primario p con valores default Parámetros opcionales Parámetros opcionales Parametros Parametros opcionales public StreamReader OpenTextFile( string path, Encoding encoding = null, encoding, bool detectEncoding = true, detectEncoding, g, g , int bufferSize = 1024); bufferSize); Argumentos con nombre OpenTextFile("foo.txt", Encoding.UTF8); OpenTextFile("foo.txt", Encoding.UTF8, bufferSize: 4096); Los argumentos con Los argumentos con nombre pueden ir en cualquier orden Los argumentos se Los argumentos se evalúan en el orden que se escriben OpenTextFile( bufferSize: 4096, path: "foo.txt", d t tE detectEncoding: false); di f l ) Los argumentos con nombre deben ir al final Los que no son opcionales se deben especificar p Interoperabilidad con COM mejorada Interoperabilidad con COM mejorada object fileName = "Test.docx"; object missing = System.Reflection.Missing.Value; doc.SaveAs(ref fileName, ref missing, ref missing, ref ref missing, ref g, missing, ref g, ref missing, ref missing, ref ref missing, ref missing, ref ref missing, ref missing, ref missing, missing, g, missing, missing, missing); doc.SaveAs("Test.docx"); Interoperabilidad con COM mejorada • • • • • Mapeo object p j Æ dynamic y automático Parámetros opcionales Propiedades indexadas Modificador “ref” opcional Interop type embedding (“No PIA”) Co y Contra varianza Co y Contra varianza string[] strings = GetStringArray(); Process(strings); void Process(object[] objects) { Process(object[] objects) { … } objects[0] = "Hello"; // Ok objects[1] = new Button(); // Exception! } List<string> strings = GetStringList(); P Process(strings); ( t i ) void Process(IEnumerable<object> objects) { Process(IEnumerable<object> objects) { … } // IEnumerable<T> is read‐only and // IEnumerable<T> is read only and // therefore safely co‐variant } Los arrays Los arrays en .NET en NET son covariantes …pero no son covariantes seguros Hasta ahora los Hasta ahora los tipos genéricos en C# eran invariantes C# 4.0 soporta en forma segura co y contra varianza Co y Contra varianza segura Co y Contra varianza segura public interface IEnumerable<out IEnumerable<T> T> { IEnumerator<T> GetEnumerator(); } out public interface IEnumerator<out IEnumerator<T> T> { IEnumerable<string> strings = GetStrings(); T Current { get; } IEnumerable<object> objects = strings; bool MoveNext(); } in public interface IComparer<in IComparer<T> T> { int Compare(T x, T y); } IComparer<object> objComp p j j p = GetComparer(); p (); IComparer<string> strComp = objComp; Varianza en C# 4.0 • Soportada en interfaces y delegates Soportada en interfaces y delegates • Los value types son siempre invariantes – IEnumerable<int> no es IEnumerable<int> no es IEnumerable<object> – Similar a la reglas existentes para arrays pero g seguras • Los parámetros de tipo ref y out tienen que ser de un tipo invariante p Varianza en.NET Framework 4.0 Interfaces System.Collections.Generic.IEnumerable<out T> System.Collections.Generic.IEnumerator<out T> System.Linq.IQueryable<out T> y q Q y System.Collections.Generic.IComparer<in T> System.Collections.Generic.IEqualityComparer<in T> System IComparable<in T> System.IComparable<in T> Delegates System.Func<in T, …, out R> System Action<in T > System.Action<in T, …> System.Predicate<in T> System.Comparison<in T> S t System.EventHandler<in T> E tH dl <i T> DEMO ¿Y todo esto sirve en el mundo real? Recursos • Ejemplos C# 4.0 Ejemplos C# 4.0 – http://code.msdn.microsoft.com/csharpfuture • Varianza en C# 4.0 Varianza en C# 4.0 – http://codepad.org/kQgbwAqJ • Visual Studio 2010 Beta 1 Download – http://tinyurl.com/o949y9 • Visual C# Developer Center p – http://csharp.net Contacto • Mail: – [email protected] – [email protected] – [email protected] • Blogs: – http://weblogs.shockbyte.com.ar/rodolfof p // g y / – http://zPod.com.ar • Twitter: – http://twitter.com/rodolfof – http://twitter.com/PabloZaiden http://twitter com/PabloZaiden ¿Preguntas? ¡ ¡Gracias!