SlideShare ist ein Scribd-Unternehmen logo
1 von 52
C# 4.0 et les améliorations à la BCL Pierre-Emmanuel Dautreppe – 04 Mars 2010 pierre@dotnethub.be – www.pedautreppe.com – @pedautreppe Découvrez le framework .NET 4.0 :  ,[object Object]
 Quelques améliorations de la « Base Class Library »,[object Object]
 Common Type System
 Programmation Orientée Objets
 Méthodes, Propriétés, Indexeurs, Evènements
 Compatibilité avec autres technologies
 Interopérabilité COM
 P/Invoke
 Code UnsafeC# 2.0 : Génériques ,[object Object]
Correction de manques
 Types nullables
 Classes statiques
 Simplifications
 Méthodes anonymes
Itérateurs(yield)C# 3.5 : LINQ et méthodes lambdas ,[object Object]
 Programmation déclarative
 Concis, mais statiquement typé
 Méthodes Lambdas
 Programmation fonctionnelle
 Meta-Programmation
 Le code devient une donnée
 Expression Trees,[object Object]
 Serveurs multi-processeurs
 Tirer parti de l’amélioration possible des performances
 en se reposant sur des frameworks
 en programmant différement Simplifier la prise en compte de la parallélisation
Agenda C# 4.0 ,[object Object]
 Paramètres nommés et optionnels
 Types dynamiques
 Interopérabilité COM
 Améliorations à la Base Class LibraryConclusion
C# 4.0 ,[object Object]
Paramètres nommés et optionnels
 Types dynamiques
 Interopérabilité COM
 Améliorations à la Base Class LibraryConclusion
Co & Contra Variance – Définition ,[object Object]
Un opérateur de conversion de type est covariant s’il ordonne les types du plus spécifique au plus générique
Si tu me fournis une SqlCommand, alors je peux me contenter de la traiter comme une DbCommand
Contravariance
Un opérateur de conversion de type est contravariant s’il ordonne les types du plus générique au plus spécifique
Si tu sais comparer deux « object », alors tu sauras aussi comparer deux « EventArgs ».	Ainsi, si tu as besoin d’un comparateur d’EventArgs, alors je peux te donner un comparateur d’objet
Co & Contra Variance – Les delegates – 1/2 public class Employé { } public class Développeur : Employé { } class Program { staticEmployé CréeEmployé() { return null; } staticDéveloppeur CréeDéveloppeur() { return null; } staticvoid Main(string[] args)    { var créeEmployé = new Func<Employé>(CréeEmployé); Employé employé1 = créeEmployé(); var créeDeveloppeur = new Func<Employé>(CréeDéveloppeur); Employé employé2 = créeDeveloppeur();    } } public class Employé { } public class Développeur : Employé { } class Program { staticEmployé CréeEmployé() { return null; } staticDéveloppeur CréeDéveloppeur() { return null; } } Func<Employé> Func<Développeur> Les delegates sontcovariants
Co & Contra Variance – Les delegates – 2/2 delegatevoidEventHandler(objectsender, EventArgse); TextBoxtxtBox = new TextBox(); txtBox.Click += txtBox.KeyDown +=  delegatevoidKeyEventHandler(objectsender, KeyEventArgse); voidMonHandler(objectsender, EventArgse) { } TextBoxtxtBox = new TextBox(); txtBox.Click += MonHandler; txtBox.KeyDown += MonHandler; Les delegates sontcontravariants
Covariance des tableaux Les arrays sontcovariants… string[] strArray = new[] { "A", "B" }; object[] objArray = strArray; …mais pas  “type safe” objArray[0] = 12; string s = strArray[0]; System.ArrayTypeMismatchException Possible seulement pour les types références Il s’agiticid’une conversion par “boxing”  Interdit int[] intArray = new[] { 1, 2, 3}; object[] objArray = intArray;
Co & Contra Variance des types génériques – 1/4 Génériques = Sécurité de typage List<string> strArray = newList<string> { "A", "B" }; List<object> objArray = strArray; Non « Type Safe »  donc non covariant List<string> strArray = newList<string> { "A", "B" }; IEnumerable<object> objEnum = strArray; « Type Safe » donc covariant
Co & Contra Variance des types génériques – 2/4 public voidTestContravariance(IComparer<string> comparer) { comparer.Compare("chaine 1", "chaine 2"); } public class MyObjectComparer : IComparer<object> { ... } public class MyStringComparer: IComparer<string> { ... } IComparer<string> stringComparer = new MyStringComparer(); stringComparer.Compare("chaine 1", "chaine 2"); IComparer<object> objectComparer = new MyObjectComparer(); objectComparer.Compare("chaine 1", "chaine 2") IComparer<T> est contravariant IComparer<string> stringComparer = new MyStringComparer(); IComparer<object> objectComparer = new MyObjectComparer(); TestContravariance(stringComparer); TestContravariance(objectComparer);
Co & Contra Variance des types génériques – 3/4 public interface IEnumerable<out T> : IEnumerable { IEnumerator<T> GetEnumerator(); } ,[object Object]
T ne doit être utilisé que comme type de retour
IEnumerable<T> est covariantIEnumerable<B>estconsidérécommeIEnumerable<A> si conversion de référence de B vers A A B IEnumerable<A> IEnumerable<B>
Co & Contra Variance des types génériques – 4/4 public interface IComparer<in T> { intCompare(T x, T y); } ,[object Object]
T ne doit être utilisé que comme paramètre d’input

Weitere ähnliche Inhalte

Was ist angesagt?

Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfacesAziz Darouichi
 
Chapitre6: Surcharge des opérateurs
Chapitre6:  Surcharge des opérateursChapitre6:  Surcharge des opérateurs
Chapitre6: Surcharge des opérateursAziz Darouichi
 
Chapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaChapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaAziz Darouichi
 
Interface fonctionnelle, Lambda expression, méthode par défaut, référence de...
Interface fonctionnelle, Lambda expression, méthode par défaut,  référence de...Interface fonctionnelle, Lambda expression, méthode par défaut,  référence de...
Interface fonctionnelle, Lambda expression, méthode par défaut, référence de...MICHRAFY MUSTAFA
 
Cours Visual Basic.NET
Cours Visual Basic.NETCours Visual Basic.NET
Cours Visual Basic.NETAziz Darouichi
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneMicrosoft
 
Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelleJean Detoeuf
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objetsAziz Darouichi
 
C++11 en 12 exemples simples
C++11 en 12 exemples simplesC++11 en 12 exemples simples
C++11 en 12 exemples simplesPethrvs
 
Introdot Netc Sharp Fr
Introdot Netc Sharp FrIntrodot Netc Sharp Fr
Introdot Netc Sharp FrGregory Renard
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11Microsoft
 
Scala : programmation fonctionnelle
Scala : programmation fonctionnelleScala : programmation fonctionnelle
Scala : programmation fonctionnelleMICHRAFY MUSTAFA
 
C++ Metaprogramming : multidimensional typelist
C++ Metaprogramming : multidimensional typelistC++ Metaprogramming : multidimensional typelist
C++ Metaprogramming : multidimensional typelistVincent Agnus
 
Seance 3- Programmation en langage C
Seance 3- Programmation en langage C Seance 3- Programmation en langage C
Seance 3- Programmation en langage C Fahad Golra
 
Visual Studio 2008 Overview
Visual Studio 2008 OverviewVisual Studio 2008 Overview
Visual Studio 2008 OverviewGregory Renard
 
Cours structures des données (langage c)
Cours structures des données (langage c)Cours structures des données (langage c)
Cours structures des données (langage c)rezgui mohamed
 
Seance 4- Programmation en langage C
Seance 4- Programmation en langage CSeance 4- Programmation en langage C
Seance 4- Programmation en langage CFahad Golra
 
Corrigés exercices langage C
Corrigés exercices langage CCorrigés exercices langage C
Corrigés exercices langage Ccoursuniv
 

Was ist angesagt? (20)

Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfaces
 
Chapitre6: Surcharge des opérateurs
Chapitre6:  Surcharge des opérateursChapitre6:  Surcharge des opérateurs
Chapitre6: Surcharge des opérateurs
 
Chapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaChapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en Java
 
Interface fonctionnelle, Lambda expression, méthode par défaut, référence de...
Interface fonctionnelle, Lambda expression, méthode par défaut,  référence de...Interface fonctionnelle, Lambda expression, méthode par défaut,  référence de...
Interface fonctionnelle, Lambda expression, méthode par défaut, référence de...
 
Vs2008 Linq
Vs2008 LinqVs2008 Linq
Vs2008 Linq
 
Cours Visual Basic.NET
Cours Visual Basic.NETCours Visual Basic.NET
Cours Visual Basic.NET
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
 
Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelle
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objets
 
C++11 en 12 exemples simples
C++11 en 12 exemples simplesC++11 en 12 exemples simples
C++11 en 12 exemples simples
 
Introdot Netc Sharp Fr
Introdot Netc Sharp FrIntrodot Netc Sharp Fr
Introdot Netc Sharp Fr
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11
 
Scala : programmation fonctionnelle
Scala : programmation fonctionnelleScala : programmation fonctionnelle
Scala : programmation fonctionnelle
 
C++ Metaprogramming : multidimensional typelist
C++ Metaprogramming : multidimensional typelistC++ Metaprogramming : multidimensional typelist
C++ Metaprogramming : multidimensional typelist
 
Seance 3- Programmation en langage C
Seance 3- Programmation en langage C Seance 3- Programmation en langage C
Seance 3- Programmation en langage C
 
Visual Studio 2008 Overview
Visual Studio 2008 OverviewVisual Studio 2008 Overview
Visual Studio 2008 Overview
 
Cours structures des données (langage c)
Cours structures des données (langage c)Cours structures des données (langage c)
Cours structures des données (langage c)
 
Programmation en C
Programmation en CProgrammation en C
Programmation en C
 
Seance 4- Programmation en langage C
Seance 4- Programmation en langage CSeance 4- Programmation en langage C
Seance 4- Programmation en langage C
 
Corrigés exercices langage C
Corrigés exercices langage CCorrigés exercices langage C
Corrigés exercices langage C
 

Andere mochten auch

Géolocalisation Google Maps pour Sage CRM
Géolocalisation Google Maps pour Sage CRMGéolocalisation Google Maps pour Sage CRM
Géolocalisation Google Maps pour Sage CRMSage france
 
Programmation fonctionnelle avec f#
Programmation fonctionnelle avec f#Programmation fonctionnelle avec f#
Programmation fonctionnelle avec f#Ernst Perpignand
 
SQL Server et la sécurité
SQL Server et la sécuritéSQL Server et la sécurité
SQL Server et la sécuritéDavid Barbarin
 
SQL Server : Tuning et Troubleshooting
SQL Server : Tuning et TroubleshootingSQL Server : Tuning et Troubleshooting
SQL Server : Tuning et TroubleshootingMicrosoft
 
soft-shake.ch - Domotique et robotique avec le micro Framework .NET
soft-shake.ch - Domotique et robotique avec le micro Framework .NETsoft-shake.ch - Domotique et robotique avec le micro Framework .NET
soft-shake.ch - Domotique et robotique avec le micro Framework .NETsoft-shake.ch
 
Wygday 2011 - C#5 Async CTP - Reactive Extensions
Wygday 2011  - C#5 Async CTP - Reactive ExtensionsWygday 2011  - C#5 Async CTP - Reactive Extensions
Wygday 2011 - C#5 Async CTP - Reactive Extensionswyggio
 
2008-10-02 Paris - Administration des applications critiques avec SQL Server ...
2008-10-02 Paris - Administration des applications critiques avec SQL Server ...2008-10-02 Paris - Administration des applications critiques avec SQL Server ...
2008-10-02 Paris - Administration des applications critiques avec SQL Server ...Patrick Guimonet
 
Initiation au code : Ateliers en C# (applications desktop et mobile native)
Initiation au code : Ateliers en C# (applications desktop et mobile native)Initiation au code : Ateliers en C# (applications desktop et mobile native)
Initiation au code : Ateliers en C# (applications desktop et mobile native)Stéphanie Hertrich
 
Comment devenir un bon programmeur en c#
Comment devenir un bon programmeur en c#Comment devenir un bon programmeur en c#
Comment devenir un bon programmeur en c#O'neil Konan
 
2009-03-13 SQL Server une plateforme crédible
2009-03-13 SQL Server une plateforme crédible2009-03-13 SQL Server une plateforme crédible
2009-03-13 SQL Server une plateforme crédiblePatrick Guimonet
 
Programmation orientee aspect 201401 - Ensim
Programmation orientee aspect 201401 - EnsimProgrammation orientee aspect 201401 - Ensim
Programmation orientee aspect 201401 - EnsimLaurent Broudoux
 
Programmation C pour AVR 8 bits
Programmation C pour AVR 8 bitsProgrammation C pour AVR 8 bits
Programmation C pour AVR 8 bitsYann Sionneau
 
Géolocalisation de données et conception de cartes interactives
Géolocalisation de données et conception de cartes interactivesGéolocalisation de données et conception de cartes interactives
Géolocalisation de données et conception de cartes interactivesPhilippe Gambette
 
ImpléMentation D’Une Solution De Bi Avec Sql Server
ImpléMentation D’Une Solution De Bi Avec Sql ServerImpléMentation D’Une Solution De Bi Avec Sql Server
ImpléMentation D’Une Solution De Bi Avec Sql ServerHamza Boukraa
 
Programmation en C sur microcontrôleur avr
Programmation en C sur microcontrôleur avrProgrammation en C sur microcontrôleur avr
Programmation en C sur microcontrôleur avrJérémy Cheynet
 

Andere mochten auch (20)

Coder F#nctionnel
Coder F#nctionnelCoder F#nctionnel
Coder F#nctionnel
 
Géolocalisation Google Maps pour Sage CRM
Géolocalisation Google Maps pour Sage CRMGéolocalisation Google Maps pour Sage CRM
Géolocalisation Google Maps pour Sage CRM
 
Programmation fonctionnelle avec f#
Programmation fonctionnelle avec f#Programmation fonctionnelle avec f#
Programmation fonctionnelle avec f#
 
SQL Server et la sécurité
SQL Server et la sécuritéSQL Server et la sécurité
SQL Server et la sécurité
 
SQL Server : Tuning et Troubleshooting
SQL Server : Tuning et TroubleshootingSQL Server : Tuning et Troubleshooting
SQL Server : Tuning et Troubleshooting
 
soft-shake.ch - Domotique et robotique avec le micro Framework .NET
soft-shake.ch - Domotique et robotique avec le micro Framework .NETsoft-shake.ch - Domotique et robotique avec le micro Framework .NET
soft-shake.ch - Domotique et robotique avec le micro Framework .NET
 
FLux, l'architecture de Facebook - Devoxx 2015
FLux, l'architecture de Facebook - Devoxx 2015FLux, l'architecture de Facebook - Devoxx 2015
FLux, l'architecture de Facebook - Devoxx 2015
 
Wygday 2011 - C#5 Async CTP - Reactive Extensions
Wygday 2011  - C#5 Async CTP - Reactive ExtensionsWygday 2011  - C#5 Async CTP - Reactive Extensions
Wygday 2011 - C#5 Async CTP - Reactive Extensions
 
2008-10-02 Paris - Administration des applications critiques avec SQL Server ...
2008-10-02 Paris - Administration des applications critiques avec SQL Server ...2008-10-02 Paris - Administration des applications critiques avec SQL Server ...
2008-10-02 Paris - Administration des applications critiques avec SQL Server ...
 
Initiation au code : Ateliers en C# (applications desktop et mobile native)
Initiation au code : Ateliers en C# (applications desktop et mobile native)Initiation au code : Ateliers en C# (applications desktop et mobile native)
Initiation au code : Ateliers en C# (applications desktop et mobile native)
 
Comment devenir un bon programmeur en c#
Comment devenir un bon programmeur en c#Comment devenir un bon programmeur en c#
Comment devenir un bon programmeur en c#
 
2009-03-13 SQL Server une plateforme crédible
2009-03-13 SQL Server une plateforme crédible2009-03-13 SQL Server une plateforme crédible
2009-03-13 SQL Server une plateforme crédible
 
Aiguisez votre c#
Aiguisez votre c#Aiguisez votre c#
Aiguisez votre c#
 
Programmation orientee aspect 201401 - Ensim
Programmation orientee aspect 201401 - EnsimProgrammation orientee aspect 201401 - Ensim
Programmation orientee aspect 201401 - Ensim
 
Programmation C pour AVR 8 bits
Programmation C pour AVR 8 bitsProgrammation C pour AVR 8 bits
Programmation C pour AVR 8 bits
 
Géolocalisation de données et conception de cartes interactives
Géolocalisation de données et conception de cartes interactivesGéolocalisation de données et conception de cartes interactives
Géolocalisation de données et conception de cartes interactives
 
ImpléMentation D’Une Solution De Bi Avec Sql Server
ImpléMentation D’Une Solution De Bi Avec Sql ServerImpléMentation D’Une Solution De Bi Avec Sql Server
ImpléMentation D’Une Solution De Bi Avec Sql Server
 
Programmation en C sur microcontrôleur avr
Programmation en C sur microcontrôleur avrProgrammation en C sur microcontrôleur avr
Programmation en C sur microcontrôleur avr
 
Programmation shell
Programmation shellProgrammation shell
Programmation shell
 
Introduction à React
Introduction à ReactIntroduction à React
Introduction à React
 

Ähnlich wie Découvrez C# 4.0 et les améliorations apportées à la BCL

02 Spécificité du C++ COURS SYS SYSSSSSS
02 Spécificité du C++  COURS SYS SYSSSSSS02 Spécificité du C++  COURS SYS SYSSSSSS
02 Spécificité du C++ COURS SYS SYSSSSSSAyoubElmrabet6
 
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES (2022-2023)
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES  (2022-2023)IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES  (2022-2023)
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES (2022-2023)Tunisie collège
 
Formation C# - Cours 2 - Programmation procédurale
Formation C# - Cours 2 - Programmation procéduraleFormation C# - Cours 2 - Programmation procédurale
Formation C# - Cours 2 - Programmation procéduralekemenaran
 
Linq et Entity framework
Linq et Entity frameworkLinq et Entity framework
Linq et Entity frameworkDNG Consulting
 
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCSiratiSoufiane
 
Cours langage c
Cours langage cCours langage c
Cours langage ccoursuniv
 
Memojava 100604104941-phpapp02
Memojava 100604104941-phpapp02Memojava 100604104941-phpapp02
Memojava 100604104941-phpapp02Rahma Boufalgha
 
programmation orienté objet c++
programmation orienté objet c++programmation orienté objet c++
programmation orienté objet c++coursuniv
 
System c eniso_jan_fev_07
System c eniso_jan_fev_07System c eniso_jan_fev_07
System c eniso_jan_fev_07haythem_2015
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScriptAbdoulaye Dieng
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introductionneuros
 
Comment écrire du code testable ?
Comment écrire du code testable ?Comment écrire du code testable ?
Comment écrire du code testable ?Fou Cha
 
Formation C# - Cours 3 - Programmation objet
Formation C# - Cours 3 - Programmation objetFormation C# - Cours 3 - Programmation objet
Formation C# - Cours 3 - Programmation objetkemenaran
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScriptAbdoulaye Dieng
 
C5 Javascript French
C5 Javascript FrenchC5 Javascript French
C5 Javascript FrenchVlad Posea
 

Ähnlich wie Découvrez C# 4.0 et les améliorations apportées à la BCL (20)

02 Spécificité du C++ COURS SYS SYSSSSSS
02 Spécificité du C++  COURS SYS SYSSSSSS02 Spécificité du C++  COURS SYS SYSSSSSS
02 Spécificité du C++ COURS SYS SYSSSSSS
 
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES (2022-2023)
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES  (2022-2023)IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES  (2022-2023)
IMPLEMENTATION EN PYTHON DES CONVENTIONS ALGORITHMIQUES (2022-2023)
 
Formation C# - Cours 2 - Programmation procédurale
Formation C# - Cours 2 - Programmation procéduraleFormation C# - Cours 2 - Programmation procédurale
Formation C# - Cours 2 - Programmation procédurale
 
Linq et Entity framework
Linq et Entity frameworkLinq et Entity framework
Linq et Entity framework
 
De Java à .NET
De Java à .NETDe Java à .NET
De Java à .NET
 
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
 
Cours langage c
Cours langage cCours langage c
Cours langage c
 
Memojava 100604104941-phpapp02
Memojava 100604104941-phpapp02Memojava 100604104941-phpapp02
Memojava 100604104941-phpapp02
 
C++ 11/14
C++ 11/14C++ 11/14
C++ 11/14
 
programmation orienté objet c++
programmation orienté objet c++programmation orienté objet c++
programmation orienté objet c++
 
System c eniso_jan_fev_07
System c eniso_jan_fev_07System c eniso_jan_fev_07
System c eniso_jan_fev_07
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introduction
 
Comment écrire du code testable ?
Comment écrire du code testable ?Comment écrire du code testable ?
Comment écrire du code testable ?
 
Formation C# - Cours 3 - Programmation objet
Formation C# - Cours 3 - Programmation objetFormation C# - Cours 3 - Programmation objet
Formation C# - Cours 3 - Programmation objet
 
C# 7 - Nouveautés
C# 7 - NouveautésC# 7 - Nouveautés
C# 7 - Nouveautés
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
C5 Javascript
C5 JavascriptC5 Javascript
C5 Javascript
 
C5 Javascript French
C5 Javascript FrenchC5 Javascript French
C5 Javascript French
 
Chapitre 1 rappel
Chapitre 1 rappelChapitre 1 rappel
Chapitre 1 rappel
 

Découvrez C# 4.0 et les améliorations apportées à la BCL

  • 1.
  • 2.
  • 5. Méthodes, Propriétés, Indexeurs, Evènements
  • 6. Compatibilité avec autres technologies
  • 9.
  • 15.
  • 17. Concis, mais statiquement typé
  • 21. Le code devient une donnée
  • 22.
  • 24. Tirer parti de l’amélioration possible des performances
  • 25. en se reposant sur des frameworks
  • 26. en programmant différement Simplifier la prise en compte de la parallélisation
  • 27.
  • 28. Paramètres nommés et optionnels
  • 31. Améliorations à la Base Class LibraryConclusion
  • 32.
  • 36. Améliorations à la Base Class LibraryConclusion
  • 37.
  • 38. Un opérateur de conversion de type est covariant s’il ordonne les types du plus spécifique au plus générique
  • 39. Si tu me fournis une SqlCommand, alors je peux me contenter de la traiter comme une DbCommand
  • 41. Un opérateur de conversion de type est contravariant s’il ordonne les types du plus générique au plus spécifique
  • 42. Si tu sais comparer deux « object », alors tu sauras aussi comparer deux « EventArgs ». Ainsi, si tu as besoin d’un comparateur d’EventArgs, alors je peux te donner un comparateur d’objet
  • 43. Co & Contra Variance – Les delegates – 1/2 public class Employé { } public class Développeur : Employé { } class Program { staticEmployé CréeEmployé() { return null; } staticDéveloppeur CréeDéveloppeur() { return null; } staticvoid Main(string[] args) { var créeEmployé = new Func<Employé>(CréeEmployé); Employé employé1 = créeEmployé(); var créeDeveloppeur = new Func<Employé>(CréeDéveloppeur); Employé employé2 = créeDeveloppeur(); } } public class Employé { } public class Développeur : Employé { } class Program { staticEmployé CréeEmployé() { return null; } staticDéveloppeur CréeDéveloppeur() { return null; } } Func<Employé> Func<Développeur> Les delegates sontcovariants
  • 44. Co & Contra Variance – Les delegates – 2/2 delegatevoidEventHandler(objectsender, EventArgse); TextBoxtxtBox = new TextBox(); txtBox.Click += txtBox.KeyDown += delegatevoidKeyEventHandler(objectsender, KeyEventArgse); voidMonHandler(objectsender, EventArgse) { } TextBoxtxtBox = new TextBox(); txtBox.Click += MonHandler; txtBox.KeyDown += MonHandler; Les delegates sontcontravariants
  • 45. Covariance des tableaux Les arrays sontcovariants… string[] strArray = new[] { "A", "B" }; object[] objArray = strArray; …mais pas “type safe” objArray[0] = 12; string s = strArray[0]; System.ArrayTypeMismatchException Possible seulement pour les types références Il s’agiticid’une conversion par “boxing”  Interdit int[] intArray = new[] { 1, 2, 3}; object[] objArray = intArray;
  • 46. Co & Contra Variance des types génériques – 1/4 Génériques = Sécurité de typage List<string> strArray = newList<string> { "A", "B" }; List<object> objArray = strArray; Non « Type Safe » donc non covariant List<string> strArray = newList<string> { "A", "B" }; IEnumerable<object> objEnum = strArray; « Type Safe » donc covariant
  • 47. Co & Contra Variance des types génériques – 2/4 public voidTestContravariance(IComparer<string> comparer) { comparer.Compare("chaine 1", "chaine 2"); } public class MyObjectComparer : IComparer<object> { ... } public class MyStringComparer: IComparer<string> { ... } IComparer<string> stringComparer = new MyStringComparer(); stringComparer.Compare("chaine 1", "chaine 2"); IComparer<object> objectComparer = new MyObjectComparer(); objectComparer.Compare("chaine 1", "chaine 2") IComparer<T> est contravariant IComparer<string> stringComparer = new MyStringComparer(); IComparer<object> objectComparer = new MyObjectComparer(); TestContravariance(stringComparer); TestContravariance(objectComparer);
  • 48.
  • 49. T ne doit être utilisé que comme type de retour
  • 50. IEnumerable<T> est covariantIEnumerable<B>estconsidérécommeIEnumerable<A> si conversion de référence de B vers A A B IEnumerable<A> IEnumerable<B>
  • 51.
  • 52. T ne doit être utilisé que comme paramètre d’input
  • 53. IComparer<T> est contravariantIComparer<A>estconsidérécommeIComparer<B> si conversion de référence de B vers A A B IComparer<A> IComparer<B>
  • 54. Variance en .NET 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>
  • 55.
  • 56. Paramètres nommés et optionnels
  • 59. Améliorations à la Base Class LibraryConclusion
  • 60. Paramètres Optionnels et Nommés – 1/4 Une méthode principale FileStream Open(string path, FileModemode, FileAccessaccess, FileShareshare) FileStream Open(string path, FileModemode, FileAccessaccess) FileStream Open(string path, FileModemode) Plusieurs overloads Redirection avec des valeurs par défaut
  • 61. Paramètres Optionnels et Nommés – 2/4 public voidMethode(intx, inty = 5, intz = 10) { } 2 paramètres optionnels Methode(10, 2, 15); Methode(10, 2); //Equivalent à Methode(10, 2, 10); Methode(10); //Equivalent à Methode(10, 5, 10); Methode(10, , 15); //INTERDIT Les paramètres omis doivent être en dernier
  • 62. Paramètres Optionnels et Nommés – 3/4 Les paramètres nommées doivent être en dernier Methode(10, z: 15); Les paramètres non optionnelsdoivent être spécifiés Methode(y: 15, x: 10); Methode(y: 15, x: 10, z: 2); Les paramètres nommés peuvent être dans n’importe quel ordre Les paramètres nommés sont évalués dans l’ordre d’écriture
  • 63.
  • 65. Doivent être des constantes de compilation
  • 66. Valeur par défaut copiée dans l’appel
  • 68. La compilation se base sur les nomsNe changez pas votre API Même question que pour constou staticreadonly A utiliserplutôt en temps que client
  • 69.
  • 70. Paramètres nommés et optionnels
  • 73. Améliorations à la Base Class LibraryConclusion
  • 74. Exemples appels « dynamiques » avec C# 3.5 Calculator calc = GetCalculator(); intresultat = calc.Add(10, 20); objectcalculator = GetCalculator(); TypecalcType = calculator.GetType(); intresult = (int)calcType.InvokeMember("Add", BindingFlags.InvokeMethod, null, calculator, new object[] { 10, 20 }); C#  C# ScriptObject calc = GetCalculator(); intresultat = (int)calc.Invoke("Add", 10, 20); Silverlight  Javascript ScriptScope python = Python.CreateRuntime().UseFile("Calculator.py"); ScriptEngineengine = python.Engine; intresultat = (int)engine.Execute ("GetCalculator().Add(10, 20)", python); C#  IronPython
  • 75. IronPython IronRuby C# Visual Basic Autres… Dynamic Language Runtime (DLR) Expression Trees Dynamic Dispatch Call Site Caching POCOBinder JavaScriptBinder PythonBinder RubyBinder COMBinder <
  • 76. Types dynamiques – 1/3 Calculator calc = GetCalculator(); intresultat = calc.Add(10, 20); Statiquement typé comme “dynamic” dynamic calc = GetCalculator(); intresultat = calc.Add(10, 20); Appel dynamique de la méthode Conversion dynamique de la valeur de retour
  • 77.
  • 78. A l’exécution,dynamic est remplacé par le type réel de chaque membre
  • 79.
  • 80.
  • 82. Nouveaux types de conversion : assignation, structurelle, …
  • 83.
  • 84.
  • 85. Créer un type dynamique – 2/2 public class MonDynamicObject : DynamicObject { Dictionary<string, object> dic = new Dictionary<string, object>(); public overrideboolTryGetMember(GetMemberBinder binder, out objectresult) { return this.dic.TryGetValue(binder.Name, out result); } public overrideboolTrySetMember(SetMemberBinder binder, objectvalue) { this.dic[binder.Name] = value; return true; } } dynamicmonObjet = new MonDynamicObject(); monObjet.Nom = "Dautreppe"; monObjet.Prenom = "Pierre-Emmanuel"; Console.WriteLine(monObjet.Prenom + " " + monObjet.Nom);
  • 86. Types dynamiques – Utilisation de la classe Expando staticvoidMain() { dynamicpersonne = new ExpandoObject(); //1. Définir des propriétés personne.Nom = "Dautreppe"; personne.Prenom = "Pierre-Emmanuel"; //2. Définir des méthodes personne.ToString = new Func<string>( () => personne.Nom + " " + personne.Prenom ); Console.WriteLine(personne.ToString()); //3. Définir un évènement personne.MonEvent = null; personne.OnMonEvent = new Action<EventArgs>((e) => { if (personne.MonEvent != null) personne.MonEvent(personne, e); }); personne.MonEvent += new EventHandler(MonEventHandler); personne.OnMonEvent(EventArgs.Empty); } privatestaticvoidMonEventHandler(dynamicobj, EventArgs e) { Console.WriteLine("MonEvent appelé sur '" + obj.ToString()); }
  • 87. Types dynamiques – Conclusion – 1/2 Que peut-on appeler ? Toute méthode définie sur l’instance Méthode publique Méthode protected Méthode private (de l’instance) Méthode d’interface (si implémentation implicite) Que ne peut-on pas appeler ? Toute méthode « n’existant pas » sur l’instance Méthode private (d’une classe de base) Méthode static (quelque soit sa visibilité) Méthode d’interface (si implémentation explicite) Méthode d’extension
  • 88.
  • 89. Quand on travaille sans type (par ex. réflexion)
  • 90. Quand on fait de l’interop
  • 91. COM
  • 93.
  • 94. Compenser des manques du Framework
  • 96. Quand ne devrait-on pas les utiliser ?
  • 97. Pour compenser une erreur de design
  • 98.
  • 99. Paramètres nommés et optionnels
  • 102. Améliorations à la Base Class LibraryConclusion
  • 103.
  • 104.
  • 105.
  • 106.
  • 107. Paramètres nommés et optionnels
  • 110.
  • 115.
  • 116. BCL – Tuples – 2/2 « new Tuple » et « Tuple.Create » sont équivalents presque !! var a = newTuple<int, int, int, int, int, int, int, Tuple<int, int>> (1, 2, 3, 4, 5, 6, 7, newTuple<int, int>(8, 9)); var b = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9)); var a = newTuple<int, int, int, int, int, int, int, Tuple<int, int>> (1, 2, 3, 4, 5, 6, 7, newTuple<int, int>(8, 9)); var b = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9)); Console.WriteLine(a.Item5); // 5 Console.WriteLine(a.Rest.Item2); // 9 var a = newTuple<int, int, int, int, int, int, int, Tuple<int, int>> (1, 2, 3, 4, 5, 6, 7, newTuple<int, int>(8, 9)); var b = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9)); Console.WriteLine(a.Item5); // 5 Console.WriteLine(a.Rest.Item2); // 9 Console.WriteLine(b.Item5); // 5 Console.WriteLine(b.Rest.Item1.Item2); // 9 Rest = Tuple<int, int> Rest = Tuple<Tuple<int, int>>
  • 117. BCL – Améliorations à System.IO string[]GetFiles(string path, string searchPattern); var errorlines = fromfile in Directory.GetFiles(@"C:ogs", "*.log") fromline in File.ReadAllLines(file) whereline.StartsWith("Error:") select string.Format("File={0}, Line={1}", file, line); File.WriteAllLines(@"C:rrorlines.log", errorlines); string[]ReadAllLines(string path); void WriteAllLines(string path, string[] contents); IEnumerable<string>EnumerateFiles(string path, string searchPattern); var errorlines = fromfile in Directory.EnumerateFiles(@"C:ogs", "*.log") fromline in File.ReadLines(file) whereline.StartsWith("Error:") select string.Format("File={0}, Line={1}", file, line); File.WriteAllLines(@"C:rrorlines.log", errorlines); IEnumerable<string>ReadLines(string path); void WriteAllLines(string path, IEnumerable<string> contents);
  • 118.
  • 119.
  • 120. Simplification pour IPC (Inter-Process Communication) Taille de la vue <= Mémoire disponible pour mapping (2Gb sur 32 bits) Stream (lecture séquentielle) Accessor (lecture aléatoire) Process 1 Process 2
  • 121. BCL – Fichiers mappés en mémoire – 2/2 Process 1 using(var mmf = MemoryMappedFile.CreateNew("FichierMappé", 1000)) { using(var stream = mmf.CreateViewStream()) new BinaryWriter(stream).Write("Bonjour"); var startInfo = new ProcessStartInfo("AutreProcess.exe"); startInfo.UseShellExecute = false; Process.Start(startInfo).WaitForExit(); } Ou mmf.CreateViewAccessor Process 2 using(var mmf = MemoryMappedFile.OpenExisting("FichierMappé")) { using(var stream = mmf.CreateViewStream()) Console.WriteLine(new BinaryReader(stream).ReadString()); }
  • 122.
  • 123. Disponible dans 3.5 (installation séparée)
  • 125. Une nouvelle API  System.Diagnostics.Contracts
  • 127. Injecte le code de vérification des contrats « aux bons endroits »
  • 129. Analyse le code pour vérifier si les contrats sont respectés
  • 131.
  • 138. Retourne la valeur avant l’appel
  • 140. Invariance de l’objet
  • 141. Appelé après chaque appel publicpublic class CompteBancaire { privateintnumeroCompte, modulo; private double solde; public voidEffectueDepot(double montant) { this.solde += montant; } staticvoidMain() { var compte = new CompteBancaire { numeroCompte = 0011234567, modulo = 27 }; compte.EffectueDepot(1000); } } public class CompteBancaire { privateintnumeroCompte, modulo; private double solde; public voidEffectueDepot(double montant) { Contract.Requires(montant > 0); this.solde += montant; } staticvoidMain() { var compte = new CompteBancaire { numeroCompte = 0011234567, modulo = 27 }; compte.EffectueDepot(1000); } } public class CompteBancaire { privateintnumeroCompte, modulo; private double solde; public voidEffectueDepot(double montant) { Contract.Requires(montant > 0); Contract.Ensures(ancien solde < nouveau solde); this.solde += montant; } staticvoidMain() { var compte = new CompteBancaire { numeroCompte = 0011234567, modulo = 27 }; compte.EffectueDepot(1000); } } public class CompteBancaire { privateintnumeroCompte, modulo; private double solde; public voidEffectueDepot(double montant) { Contract.Requires(montant > 0); Contract.Ensures(Contract.OldValue(this.solde) < this.solde); this.solde += montant; } staticvoidMain() { var compte = new CompteBancaire { numeroCompte = 0011234567, modulo = 27 }; compte.EffectueDepot(1000); } } public class CompteBancaire { privateintnumeroCompte, modulo; private double solde; public voidEffectueDepot(double montant) { Contract.Requires(montant > 0); Contract.Ensures(Contract.OldValue(this.solde) < this.solde); this.solde += montant; } [ContractInvariantMethod] privatevoidObjectInvariant() { Contract.Invariant(this.solde >= 0); Contract.Invariant(this.numeroCompte % 97 == this.modulo); } staticvoidMain() { var compte = new CompteBancaire { numeroCompte = 0011234567, modulo = 27 }; compte.EffectueDepot(1000); } }
  • 142.
  • 153. Nouveau ProfilerParallel.Invoke(() => RealiseAction1(), () => RealiseAction2(), () => RealiseAction3());
  • 154. System.Numerics – 1/2 Une nouvelle DLL : System.Numerics.dll BigInteger Un entier, « arbitrairement grand » Complex Structure pour représenter des nombres complexes
  • 155.
  • 156. Prévu pour .NET 3.5
  • 157. Retardé pour problème de performance
  • 160. Abs
  • 161. DivRem
  • 163. RemainderstaticBigInteger Factorielle(BigInteger i) { if (i == 2) return 2; return i * Factorielle(--i); } staticvoidMain() { Console.WriteLine(Factorielle(5)); } staticBigInteger Factorielle(BigInteger i) { if (i == 2) return 2; return i * Factorielle(--i); } staticvoidMain() { Console.WriteLine(Factorielle(5)); Console.WriteLine(Factorielle(10)); } staticBigInteger Factorielle(BigInteger i) { if (i == 2) return 2; return i * Factorielle(--i); } staticvoidMain() { Console.WriteLine(Factorielle(5)); Console.WriteLine(Factorielle(10)); Console.WriteLine(Factorielle(55)); } staticBigInteger Factorielle(BigInteger i) { if (i == 2) return 2; return i * Factorielle(--i); } staticvoidMain() { Console.WriteLine(Factorielle(5)); Console.WriteLine(Factorielle(10)); Console.WriteLine(Factorielle(55)); Console.WriteLine(Factorielle(542)); } 120 120 3628800 120 3628800 12696403353658275925965100847566516959580321051449436762275840000000000000 120 3628800 12696403353658275925965100847566516959580321051449436762275840000000000000 1607535095378011891056328484225529595243838798499054994766025156939288169810835272449306354580237969682411561904659247352233869578500369085015849202525200 // 11 autreslignes de chiffres 27593805066916468242618448796850243328574235699250768859321062302677755711983880776617227228201878615112377392168960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  • 164.
  • 165. Paramètres nommés et optionnels
  • 168. Améliorations à la Base Class LibraryConclusion
  • 169.
  • 170. Nouveautés au niveau du langage
  • 171. Codage
  • 174. Design
  • 177.
  • 178. Team Foundation Server se démocratise
  • 181. Nouveautés au niveau des frameworks
  • 182. ASP.NET, MVC, AJAX 4.0, Sync Framework, F#…
  • 184. C# 5.0 (?) : « Compiler As A Service »Tout simplement une nouvelle révolution
  • 185. Merci à tous ! N’oubliez pas votre formulaire de participation au concours! Prochains évènements 09/03 : Windows Live Meeting – VS 2010 - .NET 4.0 23/03 : MyTIC : Sharepoint 2010 30/03 au 01/04 : Tech Days 2010 21/04 : DotNetHub : Méthodes Agiles 28/04 : DotNetHub : NService Bus

Hinweis der Redaktion

  1. Doivent être des constantes de compilation : On ne peut donc pas définir comme valeur par défaut un appel de méthode, …Notez que si on veut assigner une méthode à un delegate, on doit « référencer » tous ses paramètres
  2. La DLR a été créée pour IronPythonPuis a été sortie dans une DLL séparée de façon à pouvoir l’utiliser dans d’autres langages dynamiquesEt enfin intégré à .NET 4.0Si on traite avec des dynamiques, le compilateur émet un « dynamic call site » à la place d’un appel direct de méthode.« DynamicDispatch » = appel de la méthode à l’exécution en utilisant le binder adéquat
  3. Conversions existantes : implicit, explicit, user-defined, boxing, reference, …Conversion d’assignation : quand on assigne un dynamic vers un type « réel »Conversion structurelle : For a given T, let red(T) (&quot;T reduced&quot;) be the type T except with all the occurrences of dynamic replaced by object. So red(Dictionary&lt;dynamic, object&gt;) == Dictionary&lt;object,object&gt;. We added the following conversions.If there is an implicit reference conversion from red(S) to red(T), then there is also an implicit reference conversion from S to T, except in the case where S is dynamic and T is object. If there is an implicit reference conversion from S to T and from T to U, and one of them is a conversion added by rule 1, then there is an implicit conversion from S to U. If there is an explicit reference conversion from red(S) to red(T), then there is also an explicit reference conversion from S to T.
  4. Attention, ne peut pas être utilisé avec IronPython pour le moment : Breaking Changes dans la DLR dans la version de .NET 4.0 Beta 1 Génère un AttributeError
  5. Utilise toujours le minimum de mémoire quelque soit le nombre de fichiers / lignes / répertoires
  6. StaticChecker : Team System uniquementAttention : l’API est disponible dans le .NET Framework 4.0, mais on doit installer CodeContracts malgré tout si on veut avoir l’onglet « Contract » dans les propriétés du projet, et les activer
  7. SpinLock : lock mais qui ne va pas mettre le thread en « idle » s’il ne peut l’acquérir. Au contraire va boucler jusqu’à l’obtenir. Meilleures performances si le temps d’attente est court (mise en « idle » est couteux)
  8. TFS : baisse des contraintes, installable sur un poste client