C# et .NET : Enigmes et puzzles

72
C# et .NET Enigmes et Puzzles Clément Gatin, Luc Vo Van Code / Développement Consultants Dev Microsoft

description

Comme des millions de développeurs, vous utilisez C# quotidiennement … mais en maitrisez-vous les subtilités ? Cette session ludique vous plongera au cœur de votre langage de prédilection au travers programmes et exemples de code qui ne cesseront de vous surprendre. Avec en prime quelques (petits) lots à gagner pour les développeurs les plus perspicaces !

Transcript of C# et .NET : Enigmes et puzzles

Page 1: C# et .NET : Enigmes  et puzzles

C# et .NETEnigmes et PuzzlesClément Gatin, Luc Vo Van

Code / Développement

Consultants DevMicrosoft

Page 2: C# et .NET : Enigmes  et puzzles

Donnez votre avis !Depuis votre smartphone, sur : http://notes.mstechdays.fr

De nombreux lots à gagner toutes les heures !!!

Claviers, souris et jeux Microsoft…

Merci de nous aider à améliorer les TechDays

http://notes.mstechdays.fr

Page 3: C# et .NET : Enigmes  et puzzles

Support PremierEntreprise Strategy

Microsoft Consulting Services

Concevoir et DéployerImaginer et Planifier Optimiser et Maintenir

Présentation de Microsoft Enterprise Services

Environnement de travail

Collaboration & social

Productivité dans le Cloud

Productivité On Premise

Application Critiques (Tier1)

Datacenter et Cloud

Relation client et ressources (ERP / CRM)

Page 4: C# et .NET : Enigmes  et puzzles

4 ouvrages écrits par 13 Microsoftees

http://www.editions-eyrolles.com/livres/Windows-8-pour-les-professionnels

Page 5: C# et .NET : Enigmes  et puzzles

Introduction et objectifs

Les énigmes1. Typage explicite (ou pas)2. Plus Plus3. Remise à Zéro4. (D)étonnante combinaison5. C# dans tous ses états6. Bouquet final

Agenda

Page 6: C# et .NET : Enigmes  et puzzles

INTRODUCTION ET OBJECTIFS

Page 7: C# et .NET : Enigmes  et puzzles

Approfondir la connaissance d’un outil fondamental

Apprécier la sophistication du compilateur

Repartir avec quelques bonnes pratiques

Se tester !

Pourquoi cette session ?

Page 8: C# et .NET : Enigmes  et puzzles

Spécifications du langage

Historique en bref

Visual C#

Page 9: C# et .NET : Enigmes  et puzzles

A. Sur InternetB. Sur le blog d’Anders HejlsbergC. Je l’ai toujours sur moiD. Dans l’aide F1 de Visual Studio

Enigme 0 : Où trouver la spécification ?

Page 10: C# et .NET : Enigmes  et puzzles

A. Sur InternetB. Sur le blog d’Anders HejlsbergC. Je l’ai toujours sur moiD. Dans l’aide F1 de Visual Studio

Enigme 0 : Où trouver la spécification ?

C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC#\Specifications

Page 11: C# et .NET : Enigmes  et puzzles

Spécifications du langage

ILDASM

Historique en bref

Visual C#

Page 12: C# et .NET : Enigmes  et puzzles

Merci d’être venus si nombreux !

this.Warrior = true;C’est parti.

Page 13: C# et .NET : Enigmes  et puzzles

TYPAGE EXPLICITE (OU PAS)Enigme 1

Page 14: C# et .NET : Enigmes  et puzzles

demo

{ typage explicite }(ou pas)

Page 15: C# et .NET : Enigmes  et puzzles

A. Typage expliciteB. var C. Aucun

Enigme 1 : Quel mot clé est recommandé ?

Page 16: C# et .NET : Enigmes  et puzzles

A. Typage expliciteB. var C. Aucun

Enigme 1 : Quel mot clé est recommandé ?

Page 17: C# et .NET : Enigmes  et puzzles

ILDASM (Intermediate Language Disassembler) est livré avec Visual Studio et permet de parcourir l’IL

var ou déclaration explicite : c’est pareil

var != dynamic. Réservez dynamic à l’interop !

En synthèse

Page 18: C# et .NET : Enigmes  et puzzles

PLUS PLUSEnigme 2

Page 19: C# et .NET : Enigmes  et puzzles

demo

{ i++ }

Page 20: C# et .NET : Enigmes  et puzzles

A. 1B. 2C. Ne compile pas

Enigme 2 : Qu’affiche le programme ?

Page 21: C# et .NET : Enigmes  et puzzles

A. 1B. 2C. Ne compile pas

Enigme 2 : Qu’affiche le programme ?

Page 22: C# et .NET : Enigmes  et puzzles

C# spécifie les comportements de manière détaillée

C’est la fin de l’échauffement !

En synthèse

Page 23: C# et .NET : Enigmes  et puzzles

CLASSES ET STRUCTURES(petit) rappel

Page 24: C# et .NET : Enigmes  et puzzles

La pile (stack)

Un espace de stockage par fonction

Contient les variables locales de la fonction

Page 25: C# et .NET : Enigmes  et puzzles

La pile (stack)

static void Main(){ FaitQqch(); FaitAutreChose();}

Un espace de stockage par fonction

Contient les variables locales de la fonction

Page 26: C# et .NET : Enigmes  et puzzles

La pile (stack)

Main

static void Main(){ FaitQqch(); FaitAutreChose();}

Un espace de stockage par fonction

Contient les variables locales de la fonction

Page 27: C# et .NET : Enigmes  et puzzles

La pile (stack)

MainFaitQqch

static void Main(){ FaitQqch(); FaitAutreChose();}

Un espace de stockage par fonction

Contient les variables locales de la fonction

Page 28: C# et .NET : Enigmes  et puzzles

La pile (stack)

Main

FaitAutreChose

static void Main(){ FaitQqch(); FaitAutreChose();}

Un espace de stockage par fonction

Contient les variables locales de la fonction

Page 29: C# et .NET : Enigmes  et puzzles

La pile (stack)

Main

static void Main(){ FaitQqch(); FaitAutreChose();}

Un espace de stockage par fonction

Contient les variables locales de la fonction

Page 30: C# et .NET : Enigmes  et puzzles

Le tas (heap)

Un espace de stockage pour le processus*

Contient les allocations d’objets : new()

Allocation contigüe en mémoire, garbage collectée et compactée

Page 31: C# et .NET : Enigmes  et puzzles

Le tas (heap)

Les classes sontallouées sous forme d’objets sur le tason manipule un pointeur vers l’objet

User utilisateur = new User();

Page 32: C# et .NET : Enigmes  et puzzles

Le tas (heap)

Luc

User utilisateur = new User();utilisateur.Name = "Luc";

Les classes sontallouées sous forme d’objets sur le tason manipule un pointeur vers l’objet

Page 33: C# et .NET : Enigmes  et puzzles

Le tas (heap)

Luc28/11/1978

Les structures (struct)allouées localement : sur le tas ou dans l’objet

DateTime lucBirth = new DateTime(1979, 11, 28);

Page 34: C# et .NET : Enigmes  et puzzles

Le tas (heap)

Les structures (struct)allouées localement : sur le tas ou dans l’objet

DateTime lucBirth = new DateTime(1979, 11, 28);utilisateur.BirthDate = lucBirth;

Luc28/11/1978

28/11/1978

Page 35: C# et .NET : Enigmes  et puzzles

Le tas (heap)

Les structures (struct)allouées localement : sur le tas ou dans l’objetmanipulées par copie de valeurDateTime lucBirth = new DateTime(1979, 11, 28);utilisateur.BirthDate = lucBirth;

Luc28/11/1978

28/11/1978

Page 36: C# et .NET : Enigmes  et puzzles

REMISE À ZÉROEnigme 3

Page 37: C# et .NET : Enigmes  et puzzles

demo

{ Remise à Zéro }

Page 38: C# et .NET : Enigmes  et puzzles

A. OuiB. NonC. Ca dépend des options du compilateurD. Ca veut dire quoi « ça compile » ?

Enigme 3 : Est-ce que ça compile ?

Page 39: C# et .NET : Enigmes  et puzzles

A. OuiB. NonC. Ca dépend des options du compilateurD. Ca veut dire quoi « ça compile » ?

Enigme 3 : Est-ce que ça compile ?

Page 40: C# et .NET : Enigmes  et puzzles

Le compilateur sait (assez) bien déterminer si les chemins de construction initialisent tous les membres

C’est un mécanisme fondamental du déterminisme de .NET

:this() permet d’enchaîner les ctor pour les objets complexes

this = new peut impressionner en soirée

En synthèse

- 40

Page 41: C# et .NET : Enigmes  et puzzles

DANS LES COULISSES DES PROPRIÉTÉS

(petit) rappel

Page 42: C# et .NET : Enigmes  et puzzles

demo

{ Propriétés }

Page 43: C# et .NET : Enigmes  et puzzles

(D)ÉTONNANTE COMBINAISONEnigme 4

Page 44: C# et .NET : Enigmes  et puzzles

demo

{ (D)étonnante Combinaison }

Page 45: C# et .NET : Enigmes  et puzzles

A. False, FalseB. False, TrueC. False, NullReferenceExceptionD. La réponse D

Enigme 4 : Qu’affiche le programme ?

Page 46: C# et .NET : Enigmes  et puzzles

A. False, FalseB. False, TrueC. False, NullReferenceExceptionD. La réponse D

Enigme 4 : Qu’affiche le programme ?

Page 47: C# et .NET : Enigmes  et puzzles

Performance sur les objets valeursPas de garbage collectionPas d’indirection de pointeur

Les objets valeurs sont manipulés par copie, doncAttention aux mises à jourLes copies sont consommatrices en performance et en mémoire. 10 appels imbriqués = 10 copies = 10x en RAM

La copie de valeur peut engendrer des bugs difficiles à diagnostiquer

En synthèse

- 47

Page 48: C# et .NET : Enigmes  et puzzles

Utilisez les structs pour des objets de petite taille

Evitez les confusions en n’ayant que des structs dont les champs sont en lecture seule

Préconisations

- 48

Page 49: C# et .NET : Enigmes  et puzzles

C# DANS TOUS SES ÉTATSEnigme 5

Page 50: C# et .NET : Enigmes  et puzzles

demo

{ C# dans tous ses états }yield return

Page 51: C# et .NET : Enigmes  et puzzles

A. Nom1, Nom2, Clement, LucB. Nom1, Clement, Nom2, LucC. Clement, LucD. Nom1, Nom2

Enigme 5 : Qu’affiche ce programme

Page 52: C# et .NET : Enigmes  et puzzles

A. Nom1, Nom2, Clement, LucB. Nom1, Clement, Nom2, LucC. Clement, LucD. Nom1, Nom2

Enigme 5 : Qu’affiche ce programme

Page 53: C# et .NET : Enigmes  et puzzles

Une machine à états ?

- 53

1

2

3 5

4

Une machine à états est un ensemble d’états et de transitions n

Page 54: C# et .NET : Enigmes  et puzzles

Une machine à états ?

- 54

public static IEnumerable<string> GetNames(){

Console.WriteLine("Nom 1"); yield return "Clement";

Console.WriteLine("Nom 2"); yield return "Luc";

}

1

2

3

Page 55: C# et .NET : Enigmes  et puzzles

Chaque yield return correspond à un étatLe code entre deux yield return correspond à une transition

Le compilateur créé une classe machine à étatsMoveNext passe à l’état suivantL’état en cours est sauvegardéLes variables locales de la fonctions sont des

membresChaque appel de MoveNext fait un Goto

yield return

- 55

Page 56: C# et .NET : Enigmes  et puzzles

demo

{ C# dans tous ses états }async await

Page 57: C# et .NET : Enigmes  et puzzles

Chaque appel à une méthode préfixée de await est un état

Le code entre deux appels est une transition

Lors d’un appel à une méthode async, si après l’appel celle si n’est pas terminée (IsCompleted = false), un « awaiter » est créé, qui rappellera la machine à état à la fin de la tâche, pour continuer à l’état courant

async await

- 57

Page 58: C# et .NET : Enigmes  et puzzles

Le compilateur génère des machines à état, qui permettent d’implémenter les scénarios de « reprise »

yield return et async sont des constructions bien plus sophistiquées qu’elles n’en ont l’air

L’intelligence et la quantité de code fournie par le compilateur est appréciable… et permet d’être plus productif

En synthèse

- 58

Page 59: C# et .NET : Enigmes  et puzzles

BOUQUET FINALEnigme 6

Page 60: C# et .NET : Enigmes  et puzzles

demo

{ Bouquet final }

Page 61: C# et .NET : Enigmes  et puzzles

A. Alice a 10 ans, Bob a 11 ans, Charlie a 12 ans, Dave a 13 ans

B. Alice a 10 ans, Alice a 10 ans, Alice a 10 ans, Alice a 10 ans

C. Dave a 13 ans, Dave a 13 ans, Dave a 13 ans, Dave a 13 ans

D. Ne compile pas

Enigme 6 : Qu’affiche ce programme

Page 62: C# et .NET : Enigmes  et puzzles

A. Alice a 10 ans, Bob a 11 ans, Charlie a 12 ans, Dave a 13 ans

B. Alice a 10 ans, Alice a 10 ans, Alice a 10 ans, Alice a 10 ans

C. Dave a 13 ans, Dave a 13 ans, Dave a 13 ans, Dave a 13 ans

D. Ne compile pas

Enigme 6 : Qu’affiche ce programme

Page 63: C# et .NET : Enigmes  et puzzles

demo

{ Bouquet final }« The Encore »

Page 64: C# et .NET : Enigmes  et puzzles

A. Alice a 10 ans, Bob a 11 ans, Charlie a 12 ans, Dave a 13 ans

B. Alice a 10 ans, Alice a 10 ans, Alice a 10 ans, Alice a 10 ans

C. Dave a 13 ans, Dave a 13 ans, Dave a 13 ans, Dave a 13 ans

D. Ne compile pas

Enigme 6 : Qu’affiche ce programme

Page 65: C# et .NET : Enigmes  et puzzles

static string[] _Names = new[] { "Alice", "Bob", "Charlie" };

static void Main(string[] args){ string messageFormat = "Hello {0}";

List<Action> actions = new List<Action>();

for (int i = 0; i < _Names.Length; ++i) { string name = _Names[i]; actions.Add(() => Console.WriteLine(messageFormat, name)); }

foreach (var action in actions) action(); Console.ReadLine();}

class Main_Scope1{ string messageFormat; List<Action> actions;}

class Main_Scope2{ string name; Main_Scope1 parentScope;}

messageFormat = "Hello {0}"actions = { }

parentScopeName = "Alice"

parentScopeName = "Bob"

parentScopeName = "Charlie"

Action

Action

Action

Visual Studio 2012

Page 66: C# et .NET : Enigmes  et puzzles

static string[] _Names = new[] { "Alice", "Bob", "Charlie" };

static void Main(string[] args){ string messageFormat = "Hello {0}";

List<Action> actions = new List<Action>();

string name; for (int i = 0; i < _Names.Length; ++i) { name = _Names[i]; actions.Add(() => Console.WriteLine(messageFormat, name)); }

foreach (var action in actions) action(); Console.ReadLine();}

class Main_Scope1{ string messageFormat; List<Action> actions; string name;}

class Main_Scope2{ Main_Scope1 parentScope;}

messageFormat = "Hello {0}" actions = { }  name ="Charlie"

parentScope

parentScope

parentScope

Action

Action

Action

Visual Studio ≤ 2010

Page 67: C# et .NET : Enigmes  et puzzles

Les closures sont un outil pratique et élégant dont la mécanique est implémentée par le compilateur

Les breaking changes au niveau compilation sont extrêmement rares, et sont pris très au sérieux par Microsoft

En synthèse

- 67

Page 68: C# et .NET : Enigmes  et puzzles

Conclusion

Page 69: C# et .NET : Enigmes  et puzzles

Les évolutions du langage C# sont principalement liées au compilateur lui-même, avec peu de support spécifique de la CLR

Parti d’une programmation purement itérative proche du langage machine, le C# permet aujourd’hui d’exprimer élégamment des principes complexes par la génération de code

AsynchronismeClosuresGénérateurs

En synthèse

- 69

Page 70: C# et .NET : Enigmes  et puzzles

int i = 0;Console.Write(string.Format("{0} {1} {2} {3}",

++i,i++ * ++i,i,i++ + i++));

Pour finir http://notes.mstechdays.fr

Page 71: C# et .NET : Enigmes  et puzzles

Donnez votre avis !Depuis votre smartphone, sur : http://notes.mstechdays.fr

De nombreux lots à gagner toutes les heures !!!

Claviers, souris et jeux Microsoft…

Merci de nous aider à améliorer les TechDays

http://notes.mstechdays.fr

Page 72: C# et .NET : Enigmes  et puzzles

Formez-vous en ligne

Retrouvez nos évènements

Faites-vous accompagner gratuitement

Essayer gratuitement nos solutions IT

Retrouver nos experts Microsoft

Pros de l’ITDéveloppeurs

www.microsoftvirtualacademy.com

http://aka.ms/generation-app

http://aka.ms/evenements-developpeurs

http://aka.ms/itcamps-france

Les accélérateursWindows Azure, Windows Phone,

Windows 8

http://aka.ms/telechargements

La Dev’Team sur MSDNhttp://aka.ms/devteam

L’IT Team sur TechNethttp://aka.ms/itteam