L'outil le plus intelligent enfin à jour ! (Resharper) 6. juillet 2008 Olivier C#, LINQ, Visual Studio (0) Resharper, si vous ne connaissez pas c'est que vous ne développez pas sous .NET ! C'est en effet un [Plus]
Quizz C#. Vous croyez connaître le langage ? et bien regardez ce qui suit ! 3. juillet 2008 Olivier C#, Framework .NET (10) C# est un langage merveilleux, plein de charme... et de surprises ! En effet, s'écartant des chemins battus et intégrant de nombreuses extensions comme Linq aujourd'hui ou les méthodes anonymes hier, il est en perpétuelle évolution. Mais ces "extensions" transforment progressivement un langage déjà subtile à la base (plus qu'il n'y paraît) en une jungle où le chemin le plus court n'est pas celui que les explorateurs que nous sommes auraient envisagé... Pour se le prouver, 6 quizz qui vous empêcheront de bronzer idiot ou de vous endormir au boulot ! Un petit projet exemple avec les questions et les réponses sera téléchargeable en fin d'article demain... [EDIT 4-7-08] Le lien se trouve désormais en fin d'article. Le code source contient les réponses au quizz. Quizz 1 Etant données les déclarations suivantes : class ClasseDeBase { public virtual void FaitUnTruc(int x) { Console.WriteLine("Base.FaitUnTruc(int)"); } } class ClasseDérivée : ClasseDeBase { public override void FaitUnTruc(int x) { Console.WriteLine("Dérivée.FaitUnTruc(int)"); } public void FaitUnTruc(object o) { Console.WriteLine("Dérivée.FaitUnTruc(object)"); } } Pouvez-vous prédire l'affiche du code suivant et expliquer la sortie réelle : ClasseDérivée d = new ClasseDérivée(); int i = 10; d.FaitUnTruc(i); Gratt' Gratt' Gratt'..... Quizz 2 Pouvez-vous prédire l'affichage de cette séquence et expliquer l'affichage réel ? double d1a = 1.00001; double d2a = 0.00001; Console.WriteLine((d1a - d2a) == 1.0); double d1b = 1.000001; double d2b = 0.000001; Console.WriteLine((d1b - d2b) == 1.0); double d1c = 1.0000001; double d2c = 0.0000001; Console.WriteLine((d1c - d2c) == 1.0); Je vous laisse réfléchir ... Quizz 3 Toujours le même jeu : prédire ce qui va être affiché et expliquer ce qui est affiché réellement... c'est forcément pas la même chose sinon le quizz n'existerait pas :-) List<Travail> travaux = new List<Travail>(); Console.WriteLine("Init de la liste de delegates"); for (int i = 0; i < 10; i++) { travaux.Add(delegate { Console.WriteLine(i); }); } Console.WriteLine("Activation de chaque delegate de la liste"); foreach (Travail travail in travaux) travail(); Les apparences sont trompeuses, méfiez-vous ! Quizz 4 Ce code compile-t-il ? public enum EtatMoteur { Marche, Arrêt } public static void DoQuizz() { EtatMoteur etat = 0.0; Console.WriteLine(etat); } Quizz 5 Etant données les déclarations suivantes : private static void Affiche(object o) { Console.WriteLine("affichage <object>"); } private static void Affiche<T>(params T[] items) { Console.WriteLine("Affichage de <params T[]>"); } Pouvez-vous prédire et expliquer la sortie de l'appel suivant : Affiche("Qui va m'afficher ?"); Je sens que ça chauffe :-) Quizz 6 Etant données les déclarations suivantes : delegate void FaitLeBoulot(); private static FaitLeBoulot FabriqueLeDélégué() { Random r = new Random(); Console.WriteLine("Fabrique. r = "+r.GetHashCode()); return delegate { Console.WriteLine(r.Next()); Console.WriteLine("delegate. r = "+r.GetHashCode()); }; } Quelle sera la sortie de la séquence suivante : FaitLeBoulot action = FabriqueLeDélégué(); action(); action(); Conclusion C# est un langage d'une grande souplesse et d'une grande richesse. Peut-être qu'à devenir trop subtile il peut en devenir dangereux, comme C++ était dangereux car trop permissif. Avec C#, même de très bons développeurs peuvent restés interloqués par la sortie réelle d'une séquence qui n'a pourtant pas l'air si compliquée. Ses avantages sont tels qu'il mérite l'effort de compréhension supplémentaire pour le maîtriser réellement, mais tout développeur C# (les moyens comme ceux qui pensent être très bons!) doit être mis au moins une fois dans sa vie face à un tel quizz afin de lui faire toucher la faiblesse de son savoir et les risques qu'il prend à coder sans vraiment connaître le langage. Comme toujours l'intelligence est ce bel outil qui nous permet de mesurer à quel point nous ne savons rien. Nous sommes plutôt habitués à envisager cette question sous un angle métaphysique, le développement nous surprend lorsque lui aussi nous place face à cette réalité... Pour le projet exemple dont le source contient les réponses cliquez sur le lien en fin de billet. So (et plus que jamais!) .. Stay Tuned ! Quizz.rar (103,41 kb)
Linq au quotidien, petites astuces et utilisations détournées... 30. juin 2008 Olivier C#, LINQ (3) Linq je vous en parle souvent, c'est tellement génial. Et ce que j'aime bien c'est trouver des utili [Plus]
Donner du peps à Linq ! (Linq dynamique et parser d'expressions) 14. juin 2008 Olivier C#, Données, LINQ (8) J'ai eu moulte fois ici l'occasion de dire tout le bien que je pense de LINQ, de sa puissance, de sa souplesse, de sa versatilité (de xml à SQL en passant par les objets et l'Entity Framework). Mais une petite chose me chagrinait : toute cette belle puissance s'entendait "hard coded". Je veux dire par là que les expressions et requêtes LINQ s'écrivent en C# dans le code et qu'il semblait très difficile de rendre la chose très dynamique, sous entendu dépendant d'expressions tapées à l'exécution de l'application. En un mot, faire du LINQ dynamique comme on fait du SQL dynamique. Ce besoin est bien réel et ne concerne pas que les sources SQL. Prenez une simple liste d'objets que l'utilisateur peut vouloir trier selon l'une des propriétés ou filtrer selon le contenu des objets... Comment implémenter une telle feature ? Contourner ce manque en écrivant des parsers, en jonglant avec les expressions lamba et la réflexion n'est pas, il faut l'avouer, ce qu'il y a de plus simple. Mais rassurez-vous chez Microsoft des gens y ont pensé pour nous ! Seulement voila, la chose est assez confidentielle il faut bien le dire, et on ne tombe pas dessus par hasard. Ou alors c'était un jour à jouer au Lotto, voire à contrôler, selon les mauvaises langues, l'emploi du temps de sa femme ! La chose s'appelle "LINQ Dynamic Query Library", un grand nom pour une petite chose puisqu'il s'agit en réalité d'un simple fichier source C# à ajouter à ses applications. Mais quel fichier source ! Toute la difficulté consiste donc à savoir que ce fichier existe et mieux, où il se cache... C'est là que c'est un peu vicieux, la chose se cache dans un sous-répertoire d'un zip d'exemples Linq/C#, fichier lui-même astucieusement planqué dans la jungle des milliers de téléchargement de MSDN... Sans plus attendre allez chercher le fichier cliquant ici. Une fois que vous aurez accepté les termes de la licence ("I Accept" tout en bas à gauche) vous recevrez le fichier "CSharpSamples.zip". Dans ce dernier (dont tout le contenu est vraiment intéressant) aller dans le répertoire "LinqSamples" puis dans le projet "DynamicQuery" vous descendrez dans une autre sous-répertoire appelé lui aussi "DynamicQuery" (non, ce n'est pas un jeu de rôle, juste un téléchargement MSDN!). Et là, le Graal s'y trouve, "Dynamic.cs". Copiez-le dans vos projets, et ajouter un "using System.Linq.Dynamic". A partir de là vous pourrez utiliser la nouvelle syntaxe permettant de faire du LINQ dynamique. A noter que dans le répertoire de la solution vous trouverez aussi un fichier "Dynamic Expressions.html" qui explique la syntaxe du parser. Quelles sont les possibilités de LINQ Dynamic Query Library ? C'est assez simple, pour vous expliquer en deux images je reprend deux captures écrans tirées du blog de Scott Guthrie (un excellent blog à visiter si vous parlez l'anglais). Voici un exemple de requête LINQ (en VB.NET, si j'avais refait la capture cela aurait été du C#, mais je ne vais pas rouspéter hein ! ) Maintenant voici la même requête utilisant du LINQ dynamique : Vous voyez l'astuce ? Le filtrage et le tri sont maintenant passés en chaîne de caractères... Bien entendu cette chaîne peut avoir été construite dynamiquement par code (c'est tout l'intérêt) ou bien saisie depuis un TextBox rempli par l'utilisateur. Ici pas de risque d'attaque par "SQL injection", d'abord parce que LINQ n'est pas limité à SQL et que le problème ne se pose que dans ce cas, mais surtout parce que LINQ to SQL utilise des classes issues d'un modèle de données "type safe" et que par défaut LINQ to SQL est protégé contre les attaques de ce type. Pas de souci à se faire donc. Pour terminer j'insisterai lourdement sur le fait que LINQ ne se limite pas aux données SQL, et que l'astuce de LINQ dynamique ici décrite s'applique même à LINQ to Object par exemple. Laisser la possibilité à un utilisateur de trier une List<> ou une Collection<>, de la filtrer, tout cela en mémoire et sans qu'il y ait la moindre base de données est bien entendu possible. LINQ est vraiment une innovation majeure en matière de programmation, pouvoir le dynamiser simplement c'est atteindre le nirvana... Je vous laisse vous jeter sur vos claviers pour expérimenter du LINQ dynamique, amusez-vous bien ! ..et surtout.. Stay tuned !
Les class Helpers, enfer ou paradis ? 17. avril 2008 Olivier C#, Framework .NET (1) Les class helpers sont une nouvelles features de C# 3.0. Ce billet montre comment s'en servir dans la pratique. [Plus]