C# et .NET : Enigmes et puzzles

Post on 24-May-2015

641 views 0 download

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

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

Code / Développement

Consultants DevMicrosoft

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

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)

4 ouvrages écrits par 13 Microsoftees

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

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

INTRODUCTION ET OBJECTIFS

Approfondir la connaissance d’un outil fondamental

Apprécier la sophistication du compilateur

Repartir avec quelques bonnes pratiques

Se tester !

Pourquoi cette session ?

Spécifications du langage

Historique en bref

Visual C#

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 ?

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

Spécifications du langage

ILDASM

Historique en bref

Visual C#

Merci d’être venus si nombreux !

this.Warrior = true;C’est parti.

TYPAGE EXPLICITE (OU PAS)Enigme 1

demo

{ typage explicite }(ou pas)

A. Typage expliciteB. var C. Aucun

Enigme 1 : Quel mot clé est recommandé ?

A. Typage expliciteB. var C. Aucun

Enigme 1 : Quel mot clé est recommandé ?

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

PLUS PLUSEnigme 2

demo

{ i++ }

A. 1B. 2C. Ne compile pas

Enigme 2 : Qu’affiche le programme ?

A. 1B. 2C. Ne compile pas

Enigme 2 : Qu’affiche le programme ?

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

C’est la fin de l’échauffement !

En synthèse

CLASSES ET STRUCTURES(petit) rappel

La pile (stack)

Un espace de stockage par fonction

Contient les variables locales de la fonction

La pile (stack)

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

Un espace de stockage par fonction

Contient les variables locales de la fonction

La pile (stack)

Main

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

Un espace de stockage par fonction

Contient les variables locales de la fonction

La pile (stack)

MainFaitQqch

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

Un espace de stockage par fonction

Contient les variables locales de la fonction

La pile (stack)

Main

FaitAutreChose

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

Un espace de stockage par fonction

Contient les variables locales de la fonction

La pile (stack)

Main

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

Un espace de stockage par fonction

Contient les variables locales de la fonction

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

Le tas (heap)

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

User utilisateur = new User();

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

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

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

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

REMISE À ZÉROEnigme 3

demo

{ Remise à Zéro }

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

Enigme 3 : Est-ce que ça compile ?

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

Enigme 3 : Est-ce que ça compile ?

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

DANS LES COULISSES DES PROPRIÉTÉS

(petit) rappel

demo

{ Propriétés }

(D)ÉTONNANTE COMBINAISONEnigme 4

demo

{ (D)étonnante Combinaison }

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

Enigme 4 : Qu’affiche le programme ?

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

Enigme 4 : Qu’affiche le programme ?

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

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

C# DANS TOUS SES ÉTATSEnigme 5

demo

{ C# dans tous ses états }yield return

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

Enigme 5 : Qu’affiche ce programme

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

Enigme 5 : Qu’affiche ce programme

Une machine à états ?

- 53

1

2

3 5

4

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

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

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

demo

{ C# dans tous ses états }async await

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

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

BOUQUET FINALEnigme 6

demo

{ Bouquet final }

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

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

demo

{ Bouquet final }« The Encore »

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

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

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

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

Conclusion

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

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

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

Pour finir http://notes.mstechdays.fr

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

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