C# et .NET : Enigmes et puzzles

799
-1

Published on

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 !

0 commentaires
1 mention J'aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Total des vues
799
Sur Slideshare
0
À partir des ajouts
0
Nombre d'ajouts
0
Actions
Partages
0
Téléchargements
38
Commentaires
0
J'aime
1
Ajouts 0
No embeds

No notes for slide
  • Intro code / dev
  • Notation
  • http://www.editions-eyrolles.com/livres/Windows-8-pour-les-professionnels/
  • [Luc]2001 avec .NET 1.0Conçu sur mesure pour la nouvelle CLR
  • [Luc]2001 avec .NET 1.0Conçu sur mesure pour la nouvelle CLR
  • [Luc]Prévu pour une centaine de personnesMontée progressive en sophistication dans les énigmesOn a pas pu upgrader les goodies
  • Clément
  • Clément
  • Luc
  • Luc
  • Luc
  • Clement
  • Clément
  • Version VS2010
  • Version VS2012
  • Notation
  • C# et .NET : Enigmes et puzzles

    1. 1. C# et .NET Enigmes et Puzzles Clément Gatin, Luc Vo Van Consultants Dev MicrosoftCode / Développement
    2. 2. 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 TechDayshttp://notes.mstechdays.fr
    3. 3. Présentation de Microsoft Enterprise Services Application Critiques (Tier1) Relation client et ressources (ERP / CRM) Collaboration & social Entreprise Microsoft Support Premier Strategy Consulting Services Productivité dans le Cloud Productivité On Premise Environnement de travail Datacenter et Cloud
    4. 4. 4 ouvrages écrits par 13 Microsofteeshttp://www.editions-eyrolles.com/livres/Windows-8-pour-les-professionnels
    5. 5. AgendaIntroduction et objectifsLes énigmes 1. Typage explicite (ou pas) 2. Plus Plus 3. Remise à Zéro 4. (D)étonnante combinaison 5. C# dans tous ses états 6. Bouquet final
    6. 6. INTRODUCTION ET OBJECTIFS
    7. 7. Pourquoi cette session ?Approfondir la connaissance d’un outil fondamentalApprécier la sophistication du compilateurRepartir avec quelques bonnes pratiquesSe tester !
    8. 8. Visual C#Historique en brefSpécifications du langage
    9. 9. 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
    10. 10. 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 StudioC:Program Files (x86)Microsoft Visual Studio 11.0VC#Specifications
    11. 11. Visual C#Historique en brefSpécifications du langageILDASM
    12. 12. Merci d’être venus si nombreux !this.Warrior = true;C’est parti.
    13. 13. Enigme 1TYPAGE EXPLICITE (OU PAS)
    14. 14. { typage explicite } (ou pas)
    15. 15. Enigme 1 : Quel mot clé est recommandé?A. Typage expliciteB. varC. Aucun
    16. 16. Enigme 1 : Quel mot clé est recommandé?A. Typage expliciteB. varC. Aucun
    17. 17. En synthèseILDASM (Intermediate Language Disassembler) est livré avec Visual Studio etpermet de parcourir l’ILvar ou déclaration explicite : c’est pareilvar != dynamic. Réservez dynamic à l’interop !
    18. 18. Enigme 2PLUS PLUS
    19. 19. { i++ }
    20. 20. Enigme 2 : Qu’affiche le programme ?A. 1B. 2C. Ne compile pas
    21. 21. Enigme 2 : Qu’affiche le programme ?A. 1B. 2C. Ne compile pas
    22. 22. En synthèseC# spécifie les comportements de manière détailléeC’est la fin de l’échauffement !
    23. 23. (petit) rappelCLASSES ET STRUCTURES
    24. 24. La pile (stack)
    25. 25. La pile (stack) static void Main() { FaitQqch(); FaitAutreChose(); }
    26. 26. La pile (stack) static void Main() { FaitQqch(); FaitAutreChose(); } Main
    27. 27. La pile (stack) static void Main() { FaitQqch(); FaitAutreChose(); FaitQqch } Main
    28. 28. La pile (stack) static void Main() { FaitQqch(); FaitAutreChose(); FaitAutreChose } Main
    29. 29. La pile (stack) static void Main() { FaitQqch(); FaitAutreChose(); } Main
    30. 30. Le tas (heap)
    31. 31. Le tas (heap) User utilisateur = new User();
    32. 32. Le tas (heap) User utilisateur = new User(); utilisateur.Name = "Luc"; Luc
    33. 33. Le tas (heap) DateTime lucBirth = new DateTime(1979, 11, 28); Luc 28/11 /1978
    34. 34. Le tas (heap) DateTime lucBirth = new DateTime(1979, 11, 28); utilisateur.BirthDate = lucBirth; 28/11 /1978 Luc 28/11 /1978
    35. 35. Le tas (heap) DateTime lucBirth = new DateTime(1979, 11, 28); utilisateur.BirthDate = lucBirth; 28/11 /1978 Luc 28/11 /1978
    36. 36. Enigme 3REMISE À ZÉRO
    37. 37. { Remise à Zéro }
    38. 38. Enigme 3 : Est-ce que ça compile ?A. OuiB. NonC. Ca dépend des options du compilateurD. Ca veut dire quoi « ça compile » ?
    39. 39. Enigme 3 : Est-ce que ça compile ?A. OuiB. NonC. Ca dépend des options du compilateurD. Ca veut dire quoi « ça compile » ?
    40. 40. En synthèseLe compilateur sait (assez) bien déterminer si les cheminsde construction initialisent tous les membresC’est un mécanisme fondamental du déterminisme de .NET:this() permet d’enchaîner les ctor pour les objetscomplexesthis = new peut impressionner en soirée - 40
    41. 41. (petit) rappelDANS LES COULISSES DESPROPRIÉTÉS
    42. 42. { Propriétés }
    43. 43. Enigme 4(D)ÉTONNANTE COMBINAISON
    44. 44. { (D)étonnante Combinaison }
    45. 45. Enigme 4 : Qu’affiche le programme ?A. False, FalseB. False, TrueC. False, NullReferenceExceptionD. La réponse D
    46. 46. Enigme 4 : Qu’affiche le programme ?A. False, FalseB. False, TrueC. False, NullReferenceExceptionD. La réponse D
    47. 47. En synthèsePerformance sur les objets valeurs Pas de garbage collection Pas d’indirection de pointeurLes objets valeurs sont manipulés par copie, donc Attention aux mises à jour Les copies sont consommatrices en performance et en mémoire. 10 appels imbriqués = 10 copies = 10x en RAMLa copie de valeur peut engendrer des bugs difficiles àdiagnostiquer - 47
    48. 48. PréconisationsUtilisez les structs pour des objets de petite tailleEvitez les confusions en n’ayant que des structs dont leschamps sont en lecture seule - 48
    49. 49. Enigme 5C# DANS TOUS SES ÉTATS
    50. 50. { C# dans tous ses états } yield return
    51. 51. Enigme 5 : Qu’affiche ce programmeA. Nom1, Nom2, Clement, LucB. Nom1, Clement, Nom2, LucC. Clement, LucD. Nom1, Nom2
    52. 52. Enigme 5 : Qu’affiche ce programmeA. Nom1, Nom2, Clement, LucB. Nom1, Clement, Nom2, LucC. Clement, LucD. Nom1, Nom2
    53. 53. Une machine à états ? 4 2 1 3 5 Une machine à états est un ensemble d’états n et de transitions - 53
    54. 54. Une machine à états ? public static IEnumerable<string> GetNames() { 1 Console.WriteLine("Nom 1"); yield return "Clement"; 2 Console.WriteLine("Nom 2"); yield return "Luc"; 3 } - 54
    55. 55. yield returnChaque yield return correspond à un étatLe code entre deux yield return correspond à unetransitionLe compilateur créé une classe machine à états MoveNext passe à l’état suivant L’état en cours est sauvegardé Les variables locales de la fonctions sont desmembres Chaque appel de MoveNext fait un Goto - 55
    56. 56. { C# dans tous ses états } async await
    57. 57. async awaitChaque appel à une méthode préfixée de await est un étatLe code entre deux appels est une transitionLors d’un appel à une méthode async, si après l’appel cellesi 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 - 57
    58. 58. En synthèseLe compilateur génère des machines à état, qui permettentd’implémenter les scénarios de « reprise »yield return et async sont des constructions bien plussophistiquées qu’elles n’en ont l’airL’intelligence et la quantité de code fournie par lecompilateur est appréciable… et permet d’être plus productif - 58
    59. 59. Enigme 6BOUQUET FINAL
    60. 60. { Bouquet final }
    61. 61. Enigme 6 : Qu’affiche ce programmeA. Alice a 10 ans, Bob a 11 ans, Charlie a 12 ans, Dave a 13 ansB. Alice a 10 ans, Alice a 10 ans, Alice a 10 ans, Alice a 10 ansC. Dave a 13 ans, Dave a 13 ans, Dave a 13 ans, Dave a 13 ansD. Ne compile pas
    62. 62. Enigme 6 : Qu’affiche ce programmeA. Alice a 10 ans, Bob a 11 ans, Charlie a 12 ans, Dave a 13 ansB. Alice a 10 ans, Alice a 10 ans, Alice a 10 ans, Alice a 10 ansC. Dave a 13 ans, Dave a 13 ans, Dave a 13 ans, Dave a 13 ansD. Ne compile pas
    63. 63. { Bouquet final } « The Encore »
    64. 64. Enigme 6 : Qu’affiche ce programmeA. Alice a 10 ans, Bob a 11 ans, Charlie a 12 ans, Dave a 13 ansB. Alice a 10 ans, Alice a 10 ans, Alice a 10 ans, Alice a 10 ansC. Dave a 13 ans, Dave a 13 ans, Dave a 13 ans, Dave a 13 ansD. Ne compile pas
    65. 65. class Main_Scope2 class Main_Scope1 { { string name;Visual Studio 2012 string messageFormat; Main_Scope1 parentScope; List<Action> actions; } }static string[] _Names = new[]{ "Alice", "Bob", "Charlie" };static void Main(string[] args){ string messageFormat = "Hello {0}"; messageFormat = "Hello {0}" List<Action> actions = new List<Action>(); actions = { } for (int i = 0; i < _Names.Length; ++i) { string name = _Names[i]; actions.Add(() => Console.WriteLine(messageFormat, name)); } parentScope parentScope parentScope foreach (var action in actions) Name = Name = Name = action(); "Alice" "Bob" "Charlie" Console.ReadLine();} Action Action Action
    66. 66. class Main_Scope1 class Main_Scope2 { { string messageFormat;Visual Studio ≤ 2010 List<Action> actions; } Main_Scope1 parentScope; string name; }static string[] _Names = new[]{ "Alice", "Bob", "Charlie" };static void Main(string[] args){ messageFormat = "Hello {0}" string messageFormat = "Hello {0}"; actions = { } List<Action> actions = new List<Action>(); name ="Charlie" string name; for (int i = 0; i < _Names.Length; ++i) { name = _Names[i]; actions.Add(() => Console.WriteLine(messageFormat, name)); } parentScope parentScope parentScope foreach (var action in actions) action(); Console.ReadLine();} Action Action Action
    67. 67. En synthèseLes closures sont un outil pratique et élégant dont lamécanique est implémentée par le compilateurLes breaking changes au niveau compilation sontextrêmement rares, et sont pris très au sérieux par Microsoft - 67
    68. 68. Conclusion
    69. 69. En synthèseLes évolutions du langage C# sont principalement liées aucompilateur lui-même, avec peu de support spécifique de laCLRParti d’une programmation purement itérative proche dulangage machine, le C# permet aujourd’hui d’exprimerélégamment des principes complexes par la génération decode Asynchronisme Closures Générateurs - 69
    70. 70. Pour finir http://notes.mstechdays.frint i = 0;Console.Write(string.Format("{0} {1} {2} {3}", ++i, i++ * ++i, i, i++ + i++));
    71. 71. 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 TechDayshttp://notes.mstechdays.fr
    72. 72. Développeurs Pros de l’IT http://aka.ms/generation-app Formez-vous en ligne www.microsoftvirtualacademy.com http://aka.ms/evenements- developpeurs Retrouvez nos évènements http://aka.ms/itcamps-france Les accélérateurs Faites-vous accompagnerWindows Azure, Windows Phone, gratuitement Windows 8 Essayer gratuitement nos http://aka.ms/telechargements solutions IT La Dev’Team sur MSDN Retrouver nos experts L’IT Team sur TechNet http://aka.ms/devteam Microsoft http://aka.ms/itteam

    ×