C# et .NET : Enigmes  et puzzles
Upcoming SlideShare
Loading in...5
×
 

C# et .NET : Enigmes et puzzles

on

  • 673 vues

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 ...

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 !

Statistiques

Vues

Total des vues
673
Vues sur SlideShare
673
Vues externes
0

Actions

J'aime
1
Téléchargements
18
Commentaires
0

0 Ajouts 0

No embeds

Accessibilité

Catégories

Détails de l'import

Uploaded via as Microsoft PowerPoint

Droits d'utilisation

© Tous droits réservés

Report content

Signalé comme inapproprié Signaler comme inapproprié
Signaler comme inapproprié

Indiquez la raison pour laquelle vous avez signalé cette présentation comme n'étant pas appropriée.

Annuler
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Votre message apparaîtra ici
    Processing...
Poster un commentaire
Modifier votre commentaire
  • 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 C# et .NET : Enigmes et puzzles Presentation Transcript

  • C# et .NET Enigmes et Puzzles Clément Gatin, Luc Vo Van Consultants Dev MicrosoftCode / Développement
  • 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
  • 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 ouvrages écrits par 13 Microsofteeshttp://www.editions-eyrolles.com/livres/Windows-8-pour-les-professionnels
  • 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
  • INTRODUCTION ET OBJECTIFS
  • Pourquoi cette session ?Approfondir la connaissance d’un outil fondamentalApprécier la sophistication du compilateurRepartir avec quelques bonnes pratiquesSe tester !
  • Visual C#Historique en brefSpécifications du langage
  • 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 ?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
  • Visual C#Historique en brefSpécifications du langageILDASM
  • Merci d’être venus si nombreux !this.Warrior = true;C’est parti.
  • Enigme 1TYPAGE EXPLICITE (OU PAS)
  • { typage explicite } (ou pas)
  • Enigme 1 : Quel mot clé est recommandé?A. Typage expliciteB. varC. Aucun
  • Enigme 1 : Quel mot clé est recommandé?A. Typage expliciteB. varC. Aucun
  • 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 !
  • Enigme 2PLUS PLUS
  • { i++ }
  • Enigme 2 : Qu’affiche le programme ?A. 1B. 2C. Ne compile pas
  • Enigme 2 : Qu’affiche le programme ?A. 1B. 2C. Ne compile pas
  • En synthèseC# spécifie les comportements de manière détailléeC’est la fin de l’échauffement !
  • (petit) rappelCLASSES ET STRUCTURES
  • La pile (stack)
  • La pile (stack) static void Main() { FaitQqch(); FaitAutreChose(); }
  • La pile (stack) static void Main() { FaitQqch(); FaitAutreChose(); } Main
  • La pile (stack) static void Main() { FaitQqch(); FaitAutreChose(); FaitQqch } Main
  • La pile (stack) static void Main() { FaitQqch(); FaitAutreChose(); FaitAutreChose } Main
  • La pile (stack) static void Main() { FaitQqch(); FaitAutreChose(); } Main
  • Le tas (heap)
  • Le tas (heap) User utilisateur = new User();
  • Le tas (heap) User utilisateur = new User(); utilisateur.Name = "Luc"; Luc
  • Le tas (heap) DateTime lucBirth = new DateTime(1979, 11, 28); Luc 28/11 /1978
  • Le tas (heap) DateTime lucBirth = new DateTime(1979, 11, 28); utilisateur.BirthDate = lucBirth; 28/11 /1978 Luc 28/11 /1978
  • Le tas (heap) DateTime lucBirth = new DateTime(1979, 11, 28); utilisateur.BirthDate = lucBirth; 28/11 /1978 Luc 28/11 /1978
  • Enigme 3REMISE À ZÉRO
  • { Remise à Zéro }
  • 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 ?A. OuiB. NonC. Ca dépend des options du compilateurD. Ca veut dire quoi « ça compile » ?
  • 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
  • (petit) rappelDANS LES COULISSES DESPROPRIÉTÉS
  • { Propriétés }
  • Enigme 4(D)ÉTONNANTE COMBINAISON
  • { (D)étonnante Combinaison }
  • Enigme 4 : Qu’affiche le programme ?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
  • 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
  • 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
  • Enigme 5C# DANS TOUS SES ÉTATS
  • { C# dans tous ses états } yield return
  • Enigme 5 : Qu’affiche ce programmeA. Nom1, Nom2, Clement, LucB. Nom1, Clement, Nom2, LucC. Clement, LucD. Nom1, Nom2
  • Enigme 5 : Qu’affiche ce programmeA. Nom1, Nom2, Clement, LucB. Nom1, Clement, Nom2, LucC. Clement, LucD. Nom1, Nom2
  • Une machine à états ? 4 2 1 3 5 Une machine à états est un ensemble d’états n et de transitions - 53
  • 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
  • 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
  • { C# dans tous ses états } async await
  • 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
  • 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
  • Enigme 6BOUQUET FINAL
  • { Bouquet final }
  • 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
  • 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
  • { Bouquet final } « The Encore »
  • 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
  • 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
  • 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
  • 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
  • Conclusion
  • 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
  • Pour finir http://notes.mstechdays.frint i = 0;Console.Write(string.Format("{0} {1} {2} {3}", ++i, i++ * ++i, i, i++ + i++));
  • 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
  • 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