1 / 22

C# 4

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

woody
Download Presentation

C# 4

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C# 4 8/02/2010 Mitsuru FURUTARelations techniques développeursMicrosoft France http://blogs.msdn.com/mitsu http://blogs.msdn.com/mitsufu

  2. Agenda • Introduction • Nouveautés de C# 4 • Objects typésdynamiquement • Paramètresnommés et optionnels • Interoperabilité COM améliorée • Co- et Contra-variance • Expressions • Conclusion

  3. Evolution de C# C# 4.0 Dynamic Programming C# 3.0 Language Integrated Query C# 2.0 Generics C# 1.0 Managed Code

  4. Tendances

  5. Objetstypésdynamiquement Calculator calc = GetCalculator(); int sum = calc.Add(10, 20); object calc = GetCalculator(); TypecalcType = calc.GetType(); object res = calcType.InvokeMember("Add", BindingFlags.InvokeMethod, null, newobject[] { 10, 20 }); int sum = Convert.ToInt32(res); ScriptObject calc = GetCalculator(); object res = calc.Invoke("Add", 10, 20); int sum = Convert.ToInt32(res); Statically typed to be dynamic dynamic calc = GetCalculator(); int sum = calc.Add(10, 20); Dynamic conversion Dynamic method invocation

  6. Objets typés dynamiquement Compile-time typedynamic Run-time typeSystem.Int32 dynamic x = 1; dynamic y = "Hello"; dynamic z = newList<int> { 1, 2, 3 }; • Quand les opérandessontdynamic… • L’accès aux membresestdéterminé à l’exécution • A l’exécution, le type actuel se substitue au type dynamic • Le résultatstatique de l’opérationest de type dynamic

  7. Objets typés dynamiquement 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); ... } Method chosen at compile-time:double Abs(double x) double x = 1.75; double y = Math.Abs(x); Method chosen at run-time: double Abs(double x) dynamic x = 1.75; dynamic y = Math.Abs(x); Method chosen at run-time:int Abs(int x) dynamic x = 2; dynamic y = Math.Abs(x);

  8. Démo Objets typés dynamiquement

  9. DynamicObject public class DynamicObject : IDynamicMetaObjectProvider { public virtual IEnumerable<string> GetDynamicMemberNames(); public virtual DynamicMetaObjectGetMetaObject(Expression parameter); public virtual boolTryBinaryOperation(BinaryOperationBinder binder, object arg, out object result); public virtual boolTryConvert(ConvertBinder binder, out object result); public virtual boolTryCreateInstance(CreateInstanceBinder binder, object[] args, out object result); public virtual boolTryDeleteIndex(DeleteIndexBinder binder, object[] indexes); public virtual boolTryDeleteMember(DeleteMemberBinder binder); public virtual boolTryGetIndex(GetIndexBinder binder, object[] indexes, out object result); public virtual boolTryGetMember(GetMemberBinder binder, out object result); public virtual boolTryInvoke(InvokeBinder binder, object[] args, out object result); public virtual boolTryInvokeMember(InvokeMemberBinder binder, object[] args, out object result); public virtual boolTrySetIndex(SetIndexBinder binder, object[] indexes, object value); public virtual boolTrySetMember(SetMemberBinder binder, object value); public virtual boolTryUnaryOperation(UnaryOperationBinder binder, out object result); }

  10. Démo DynamicObject

  11. Optional and Named Parameters Primary method public StreamReaderOpenTextFile( string path, Encoding encoding, booldetectEncoding, intbufferSize); Secondary overloads public StreamReaderOpenTextFile( string path, Encoding encoding, booldetectEncoding); public StreamReaderOpenTextFile( string path, Encoding encoding); public StreamReaderOpenTextFile( string path); Call primary with default values

  12. Optional and Named Parameters Optional parameters public StreamReaderOpenTextFile( string path, Encoding encoding, booldetectEncoding, intbufferSize); public StreamReaderOpenTextFile( string path, Encoding encoding = null, booldetectEncoding = true, intbufferSize = 1024); Named argument OpenTextFile("foo.txt", Encoding.UTF8); OpenTextFile("foo.txt", Encoding.UTF8, bufferSize: 4096); Named arguments can appear in any order Arguments evaluated in order written Named arguments must be last OpenTextFile( bufferSize: 4096, path: "foo.txt", detectEncoding: false); Non-optional must be specified

  13. 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");

  14. Improved COM Interoperability • Automatic object  dynamic mapping • Optional and named parameters • Indexed properties • Optional “ref” modifier • Interop type embedding (“No PIA”)

  15. Co- and Contra-variance .NET arrays are co-variant string[] strings = GetStringArray(); Process(strings); …but not safelyco-variant void Process(object[] objects) { … } void Process(object[] objects) { objects[0] = "Hello"; // Ok objects[1] = new Button(); // Exception! } Until now, C# generics have been invariant List<string> strings = GetStringList(); Process(strings); C# 4.0 supports safe co- and contra-variance void Process(IEnumerable<object> objects) { … } void Process(IEnumerable<object> objects) { // IEnumerable<T> is read-only and // therefore safely co-variant }

  16. Safe Co- and Contra-variance public interface IEnumerable<T> { IEnumerator<T> GetEnumerator(); } public interface IEnumerable<out T> { IEnumerator<T> GetEnumerator(); } out= Co-variantOutput positions only Can be treated asless derived public interface IEnumerator<T> { T Current { get; } boolMoveNext(); } public interface IEnumerator<out T> { T Current { get; } boolMoveNext(); } IEnumerable<string> strings = GetStrings(); IEnumerable<object> objects = strings; in= Contra-variantInput positions only public interface IComparer<T> { int Compare(T x, T y); } public interface IComparer<in T> { int Compare(T x, T y); } Can be treated asmore derived IComparer<object> objComp = GetComparer(); IComparer<string> strComp = objComp;

  17. Variance in C# 4.0 • Supportésur les interfaces et délégués • “La variance eststatiquementvérifiéelocalement” • Les types valeurssonttoujours invariants • IEnumerable<int> n’est pasIEnumerable<object> • Identique aux règlesactuelles des tableaux • Les paramètres ref et out nécessitent des paramètres invariants

  18. La Variance dans le .NET Framework 4.0 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>

  19. Démo Variance

  20. Démo Expressions

More Related