c# et .net : enigmes et puzzles
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
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