Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

C# et .NET : Enigmes et puzzles

1,544 views

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 !

  • Be the first to comment

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

×