.NET 4.0 a fondo

Anuncio
.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!
Descargar