Archives mensuelles : août 2011

image

L’accès aux backing fields des propriétés au-implémentées

Dans la série des VB IsNot C#, je vous propose aujourd’hui une différence d’implémentation des propriétés auto-implémentées en C# et en VB.

C’est avec une légère surprise que je viens de redécouvrir qu’en VB, il est tout à fait possible d’accéder directement aux champs privés générés par le compilateur lors de la création d’une propriété auto-implémentée :

image

Par convention, le champ est préfixée via un underscore, il ainsi tout à fait possible d’y accéder.

Alors qu’en C#, le compilateur fait en sorte que l’on ne puisse pas directement y accéder.

A noter que ce champ privé n’apparait pas dans l’intellisense lorsque l’on essaye d’y accéder.

Par contre le Go To Definition proposé par Visual Studio highlight bien la propriété Lastname lorsqu’on l’applique au champ privé. Donc même si on ne voit pas la déclaration on peut deviner la provenance de ce champ.

ReSharper reste quand à lui un peu perdu et ne sait pas trop d’où vient ce champ.

En plus d’être un peu perturbant car on peut ne pas voir d’un coup d’œil d’où vient ce champ. Cela peut poser problème lorsque l’on souhaite déclarer un champ qui porte le même nom que celui généré par le compilateur :

image

Heureusement le compilateur propose un message bien plus compréhensible :

image

image

Tester si une variable est égale à Nothing

Pour faire suite au post d’hier sur la définition du Nothing en VB, je vous propose de découvrir comment le test d’égalité à Nothing peut très vite conduire à des bugs dans votre code.

C’est en faisant une petite séance de suppression des warnings de compilation sur le projet sur lequel je travaille que j’ai rencontré ce message à plusieurs reprises :

Warning    48    This expression will always evaluate to Nothing (due to null propagation from the equals operator). To check if the value is not null consider using ‘IsNot Nothing’. 

Il y a deux manières d’effectuer des tests d’égalité à Nothing en VB et il est important de bien les distinguer :

  • Pour les types valeurs, on doit utiliser la syntaxe If myValueVar = Nothing
  • Pour les types références, il faut utiliser la syntaxe If myRefVar Is Nothing

Il faut vraiment prêter attention à ces deux contextes d’utilisation car si vous utilisez le Is ou le = dans le cas inverse, votre test ne fonctionnera pas.

Ainsi le code suivant fonctionne parfaitement :

image

Mais le code suivant ne fonctionne pas du tout :

image

Le simple fait de passer la variable en nullable oblige à changer le test d’égalité car on ne passera JAMAIS dans le bloc du IF si on laisse ce code tel quel.

J’ai rencontré ce type de problème à plusieurs reprise sur du code existant, pour une raison donc simple. Les développeurs ont passé des propriétés de type valeur en nullables sans prêter attention à également impacter les différents tests d’égalité à Nothing !

Le code correct est donc le suivant (si on ne souhaite pas utiliser la propriété HasValue) :

image

Il s’agit là d’une source de bug délicate à détecter, et un avertissement qui mériterait bien d’être considéré comme une erreur par le compilateur ! (d’où l’utilité de toujours réduire au maximum le nombre de warnings dans vos projets).

image

Nothing est différent de null

Une des différences les plus importantes entre le VB et le C# est la gestion de la nullité des types.

En VB, on utilise le mot clé Nothing et contrairement à ce que beaucoup de développeurs VB pensent,

le mot clé Nothing n’a (presque) rien à voir avec le null tel que l’on peut le connaitre dans la plupart des langages.

En effet, en VB le Nothing équivaut à Default.

La différence est très importante notamment pour les types valeurs, puisqu’il est tout à fait possible d’assigner Nothing à un type valeur ! Le type prend alors sa valeur par défaut, comme 0 pour les types numériques, ou Date.DateMin pour les dates :

image

 

Bien évidemment, pour les types références, la valeur affectée sera l’équivalent d’un null puisqu’aucune instance n’est créé lors de l’affectation de Nothing.

Pour rappel si l’on essaie de faire “la même chose” en C#, on se retrouve très justement avec une erreur de compilation :

image

Dans le prochain post, nous verrons l’impact de cette différence sur les tests d’égalité à Nothing.

News de la semaine #31 et #32

Du côté de l’actualité produits, l’équipe ADO.net propose une CTP de Code First Migrations qui permet de faire évoluer le schema d’une DB en fonction de l’évolution de votre modèle.

Toujours à propos de cette CTP de Code First Migrations, Scott Hanselman propose un package NuGet qui permet de le déployer simplement.

Xamarin lance officiellement ses produits de développement mobile (Android, iPhone)

Visual Studio LightSwitch 2011 est disponible en RTM.

Windows Phone Mango a été finalisé, et devrait être disponible dans les prochaines semaines.

Du côté des ressources techniques, Karl Shifflett propose du contenu lié à l’utilisation de MMVM au sein de WPF.

InfoQ nous propose une présentation d’Interactive Extensions (Ix) basé sur les Reactive Extensions (Rx).

Channel9 propose un nouveau show dédiée au développement natif.

Mike Taulty fait un récapitulatif des technologies Rx, TPL, Async CTP.

Du côté de l’actualité française, Eric Mittelette annonce les dates des TechDays 2010.

David Catuhe nous annonce la disponibilité des webcasts de l’après-midi du dév Kinect.