22

C# 4

  • Upload
    woody

  • View
    49

  • Download
    0

Embed Size (px)

DESCRIPTION

C# 4. 8/02/2010 Mitsuru FURUTA Relations techniques développeurs Microsoft France http://blogs.msdn.com/mitsu http:// blogs.msdn.com/mitsufu. Agenda. Introduction Nouveautés de C# 4 Objects typés dynamiquement Paramètres nommés et optionnels Interoperabilité COM améliorée - PowerPoint PPT Presentation

Citation preview

Page 1: C# 4
Page 2: C# 4

22

C# 4

8/02/2010 Mitsuru FURUTARelations techniques développeursMicrosoft Francehttp://blogs.msdn.com/mitsuhttp://blogs.msdn.com/mitsufu

Page 3: C# 4

33

Agenda

IntroductionNouveautés de C# 4

Objects typés dynamiquementParamètres nommés et optionnelsInteroperabilité COM amélioréeCo- et Contra-varianceExpressions

Conclusion

Page 4: C# 4

444

Evolution de C#

C# 1.0

C# 2.0

C# 3.0

Managed Code

Generics

Language Integrated Query

C# 4.0Dynamic Programming

Page 5: C# 4

555

Tendances

Declarative

ConcurrentDynamic

Page 6: C# 4

666

Objets typés dynamiquement

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

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

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

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

Statically typed to be dynamic

Dynamic method invocation

Dynamic conversion

Page 7: C# 4

777

Objets typés dynamiquement

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

Compile-time typedynamic

Run-time typeSystem.Int32

Quand les opérandes sont dynamic…• L’accès aux membres est déterminé à l’exécution• A l’exécution, le type actuel se substitue au type dynamic• Le résultat statique de l’opération est de type dynamic

Page 8: C# 4

888

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);

Objets typés dynamiquement

Method chosen at compile-time:

double Abs(double x)

Method chosen at run-time:

double Abs(double x)

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

Method chosen at run-time:

int Abs(int x)

Page 9: C# 4

99

DémoObjets typés dynamiquement

Page 10: C# 4

101010

DynamicObjectpublic class DynamicObject : IDynamicMetaObjectProvider{ 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); 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 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);}

Page 11: C# 4

1111

DémoDynamicObject

Page 12: C# 4

121212

Optional and Named Parameters

public StreamReader OpenTextFile( string path, Encoding encoding, bool detectEncoding, int bufferSize);

public StreamReader OpenTextFile( string path, Encoding encoding, bool detectEncoding);

public StreamReader OpenTextFile( string path, Encoding encoding);

public StreamReader OpenTextFile( string path);

Primary method

Secondary overloads

Call primary with default values

Page 13: C# 4

131313

Optional and Named Parameters

public StreamReader OpenTextFile( string path, Encoding encoding, bool detectEncoding, int bufferSize);

public StreamReader OpenTextFile( string path, Encoding encoding = null, bool detectEncoding = true, int bufferSize = 1024);

Optional parameters

OpenTextFile("foo.txt", Encoding.UTF8);OpenTextFile("foo.txt", Encoding.UTF8, bufferSize: 4096);

Named argument

OpenTextFile( bufferSize: 4096, path: "foo.txt", detectEncoding: false);

Named arguments must be last

Non-optional must be specified

Arguments evaluated in order written

Named arguments can appear in any order

Page 14: C# 4

141414

Improved COM Interoperability

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

doc.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);

doc.SaveAs("Test.docx");

Page 15: C# 4

1515

• Automatic object dynamic mapping• Optional and named parameters• Indexed properties• Optional “ref” modifier• Interop type embedding (“No PIA”)

Improved COM Interoperability

Page 16: C# 4

161616

Co- and Contra-variance

void Process(object[] objects) { … }

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

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

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

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

.NET arrays are co-variant

…but not safelyco-variant

Until now, C# generics have

been invariant

void Process(IEnumerable<object> objects) { // IEnumerable<T> is read-only and // therefore safely co-variant}

C# 4.0 supports safe co- and

contra-variance

Page 17: C# 4

171717

Safe Co- and Contra-variance

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 = Co-variantOutput positions only

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

Can be treated asless derived

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 = Contra-variantInput positions only

Can be treated asmore derived

Page 18: C# 4

1818

• Supporté sur les interfaces et délégués• “La variance est statiquement vérifiée

localement”• Les types valeurs sont toujours invariants– IEnumerable<int> n’est pas IEnumerable<object>– Identique aux règles actuelles des tableaux

• Les paramètres ref et out nécessitent des paramètres invariants

Variance in C# 4.0

Page 19: C# 4

191919

La Variance dans le .NET Framework 4.0

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>

Interfaces

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

Delegates

Page 20: C# 4

2020

DémoVariance

Page 21: C# 4

2121

DémoExpressions

Page 22: C# 4