Dot.Blog

C#, XAML, WinUI, WPF, Android, MAUI, IoT, IA, ChatGPT, Prompt Engineering

LINQ à toutes les sauces !

Je suis en train de boucler mon article de présentation de LINQ. Au départ je pensais m'en sortir en une dizaine de pages, mais j'en suis à plus du double... juste pour faire le tour des principales possibilités et sans détailler la syntaxe (ce n'est pas le but de cet article).

J'ai eu maintes fois l'occasion de vous dire ici que LINQ est l'innovation la plus fantastique que j'ai vue depuis longtemps dans un langage. Vous en saurez plus en lisant le prochain article qui sera en ligne ce week-end, mais pour vous prouver que LINQ peut servir partout et tout le temps voici deux exemples à contre-courant de l'idée qu'on se fait des utilisations possibles de LINQ :

Cas 1 : Lister les services actifs de Windows.

C'est bête mais balayer et filtrer une simple liste comme celle là (et de bien d'autres du même genre retournées par le framework .NET ou par vos applications), c'est produire du code pas très marrant... Avec LINQ ça devient :

using System.ServiceProcess; 
var srv = from s in ServiceController.GetServices()
         where s.Status == ServiceControllerStatus.Running
         select s.DisplayName;
ListBox1.DataSource = srv.ToList();

 
Je trouve ça élégant, pas vous ?

Cas 2 : Remettre à unchecked tous les Checkbox d'une form

Balayer certains contrôles d'une fiche n'est là non plus pas l'endroit où l'on s'attend à trouver du LINQ... Et pourtant ! Imaginons une fiche de saisie avec des tas de checkbox et un bouton "raz" de remise à zéro de la fiche. Balayer tous les contrôles de la fiche pour ne sélectionner que les checkbox n'est pas un code bien complexe mais avec LINQ ça devient tellement plus chouette !

var cb = (from Control c in this.Controls select c).OfType<CheckBox>();
foreach (var c in cb) c.Checked=false;
 

C'est pas plus joli et plus clair écrit comme ça ? (et encore on pourrait se passer de la variable "cb" et intégrer directement la requête LINQ après le "in" du "foreach")?

Bref, LINQ j'adore. Et j'espère bien que le papier à venir va vous transformez en fans vous aussi ! alors... Stay tuned !

Les sources du framework .NET publiées avec VS 2008 !

Voilà une bonne nouvelle : Microsoft va intégrer les sources du framework 3.5 dans Visual Studio 2008, notamment pour faciliter le debug.

Pas d'erreur toutefois: le framework ne devient pas "open source" pour autant, on a tout juste le droit de regarder les sources et de s'en servir pour debugger une application.

Nul doute aussi que la lecture du code source du framework permettra de mieux le comprendre, de s'inspirer des solutions et patterns utilisées pour sa conception et ainsi d'écrire un code encore plus en harmonie avec cette plateforme.

L'annonce de cette bonne nouvelle a été faite sur le blog de Scott Guthrie qui est General Manager chez MS et qui s'occupe notamment des équipes en charge du développement du CLR, de ASP.NET, de Silverlight, WPF, IIS 7.0, etc, etc. Un Monsieur sérieux et influent dont l'annonce vaut bien engagement et qui permet de prendre cette nouvelle très au sérieux. Les anglophones peuvent bien entendu lire la totalité de l'annonce sur le blog de Scott.

kick it on DotNetKicks.com

Une instruction méconnue de C#

Quelques mots sur un opérateur méconnu de C# qui pourtant s'avère très efficace..

Vous connaissez la syntaxe: x = (test) ? (sivrai) : (sifaux);
Cela permet en une instruction d'attribuer la valeur "sivrai" ou "sifaux" à x selon le résultat du test. Cela est très pratique et clarifie la lecture du source comparativement à l'utilisation d'un if/else.

Mais connaissez-vous la version courte de cet opérateur conditionnel ?

Le cas d'utilisation est très fréquent dans un code bien protégé : il s'agit en général d'affectuer une valeur à une variable si la valeur est non nulle, sinon d'affecter une valeur par défaut. Exemple :
string s = variable==null ? "chaîne nulle" : variable;
Ici on se protège contre le fait que la variable "variable" peut être nulle. Dans ce cas on affecte à "s" une chaîne par défaut, sinon on affecte "variable". L'utilisation de l'opérateur ?: se justifie pleinement ici (si on suppose par exemple que "variable" est un paramètre passé à la méthode en cours qui peut, même si cela n'est pas prévu, être passé à null). Cet opérateur rend l'écriture plus concise que l'utilisation de if/else qui serait:
string s; 
if (variable==null) s="chaîne nulle"; else s=variable;

Mais il y a encore plus court !

Le cas évoqué étant très fréquent, C# propose un autre opérateur conditionnel, le ??.
Ce dernier est spécialement étudié pour tester les nuls.
De fait, notre test exemple s'écrit désormais :
string s = variable ?? "chaîne vide";

En réalité l'opérateur ?? a surtout été ajouté pour gérer les types nullables. Lorsqu'on affecte une variable nullable à une autre qui ne l'est pas, il est en effet nécessaire de tester le null pour éviter une exception.
Exemple :

int? a = null; 
int y = a ?? -1;

ici, "a" est un integer nullable, que nous initialisons d'ailleurs à null, alors que "y" est un integer "standard" ne pouvant pas prendre la valeur nulle. L'utilisation de ?? est donc obligatoire ici pour éviter l'exception.
On comprend mieux la raison d'être de cet opérateur ajouté dans C# 2.0 puisque c'est dans cette version qu'on aussi été ajoutés les types nullables.

Néanmoins cette instruction très peu utilisée et méconnue rend aussi service en dehors du contexte des types nullables, notamment avec les types objets qui eux sont nullables depuis toujours. Notre exemple avec une variable string en est une illustration.

Bon développements ! (truffés désormais de "??" qui vous feront passer pour un guru de C# :-) )

Nouvelle rentrée, nouveau blog !

Bienvenue à toutes et à tous !

"Vous mé réconnéssé ? " Laughing

Pour ceux qui ne savent pas qui je suis, en deux mots : dirigeant de e-naxos, auteur de plusieurs ouvrages sur Delphi et C# chez Eyrolles, partenaire Borland de longue date (même si depuis le tournant Codegear nos voies se sont séparées), partenaire Microsoft. Ceux qui fréquentent ces milieux m'ont reconnu.

Ce nouveau blog, installé sur mon propre serveur, va me permettre de m'exprimer avec le maximum de liberté.

Non pas que le blog que je possède de longue date sur Developpez soit spécialement censuré, mais vous savez ce que c'est, il ne faut pas froisser untel, ou tel autre qui prend la mouche parce qu'on ne dit pas que du bien de tel produit ou éditeur ... Censure réelle ou auto-censure, le résultat est le même.

J'avais donc besoin d'un espace autogéré, j'ai trouve BlogEngine, un très beau moteur de blog open source en C#, et voilà comment est né Dot.Blog ! Blog avant tout technique, mes humeurs n'y seront pas donc forcément absentes mais Dot.Blog ne sera pas un blog d'opinion. 

C#, le framework .NET, Visual Studio, SQL Serveur, Silverlight, Ajax, Linq, sont autant de sujets qui me viennent à l'esprit et qui feront bientôt l'objet de billets ici.

Alors marquez cette page et revenez souvent y lire et y commenter les billets !

A très bientôt,

Olivier