Types nullables en C # ou comment vivre avec NULLS

indistinctement, les NULLS sont l’un des pires cauchemars du développeur et provoquent un grand nombre d’erreurs lors de l’heure d’application. Le manque d’outils pour les traiter de manière appropriée rend la coexistence avec le mouton noir des valeurs possibles à appliquer à une variable. Dans cet article dans le manuel .NET, nous allons essayer de jeter un peu de lumière et vous indiquer les solutions que la technologie nous offre de vivre avec les valeurs NULL.

et c’est que avec peu vous avez développé , sûr que vous ayez déjà rencontré la tâche difficile d’attribuer une valeur nulle à une variable de type valeur (int, flotteur, …) où il ne correspond pas à plus que l’utilisation de tours difficiles à effectuer, à la trace et à la documentation. Par exemple, étant donné une classe de classe avec une propriété de type entier appelée Âge, que se passe-t-il si nous prenons un objet de ladite classe d’une base de données si le champ n’était pas obligatoire dans ce domaine?

A priori, facile: Lors de la lecture de la base de données, nous vérifions si c’est NULL, et dans ce cas, nous attribuons à la propriété de la valeur de la classe -1. Bon patch, sans doute.

Cependant, opter globalement par cette idée présente plusieurs inconvénients. Tout d’abord, être fidèle à la réalité, si nous souhaitons stocker à nouveau cet objet dans la base de données, il convient de réaliser des changements inverse, c’est-à-dire de vérifier si l’âge est -1 et dans ce cas, économisez sur le terrain un null.

Deuxièmement, fixe que nous conduisons aux artifices de classe qui n’ont pas de sens dans le domaine du problème à résoudre, dans l’entité auquel elle représente. En regardant un peu de loin de loin, quelle est la signification d’un âge négatif dans une personne en personne? Aucun.

Troisième, il y a un problème de cohérence dans les consultations. Si j’ai une collection de personnes en mémoire (effectuée, par exemple en utilisant des types génériques) et que je souhaite connaître ceux qui sont en âge de définir, je devrais vérifier chaque élément si leur âge de la propriété vaut -1; Toutefois, lors de la réalisation de la même requête dans la base de données, vous devez demander la valeur null sur le champ correspondant.

True est que nous pourrions également apporter le concept à la base de données du concept « -1 signifie NULL » Le champ d’âge, mais … ne serait pas éclaboussant la structure de données avec une particularité (et une limitation) du langage de programmation utilisé? Une autre idée bizarre pourrait être d’introduire l’âge sur une chaîne et un problème résolu: les chaînes, étant un type de référence peuvent contenir des nulls sans problèmes, mais il est nécessaire de reconnaître que les ordonnations seraient régulières; -)

par Enfin, et si au lieu d’âge, où il ne peut y avoir de négatifs, nous parlions de la classe de conteurs et de sa propriété Dartal? Ici, il est clairement constaté que l’utilisation de négatifs n’est pas une ressource valide.

Solutions, à part les commentaires, il y a pour tous les goûts. Cela pourrait, par exemple, ajouter une propriété booléenne parallèle indiquée si le champ d’âge est null (un travail supplémentaire, en particulier sans plusieurs propriétés, ces valeurs sont) ou encapsulent l’âge dans une classe qui intègre un traitement logique de cette null.

Dans tous les cas, des solutions possibles sont des travailleurs, parfois complexes, et surtout trop artificielles pour être quelque chose de quotidien que c’est un champ NULL simple.

conscient de celui-ci, c # Les concepteurs ont déjà pris en compte dans sa version 2.0 une fonctionnalité intéressante: types nullables ou types annulables, un mécanisme qui permet à la null de notre vie de manière non traumatique.

La ligne suivante a généré une erreur dans Compilation, qui a dit, et cela ne manquait pas de raison, que « ne peut pas être converti null dans » INT « car il s’agit d’un type de valeur »:

int S = null;

de C # 2.0, il est possible de procéder comme suit:

int? s;
s = null; o
s = 1;

Observez l’interrogatoire avec le type, qui correspond à l’indication que la variable est entière, mais prend également en charge une valeur null.

à l’intérieur, cela fonctionne comme suit: int? C’est un alias du système de type générique.Nallulable. En fait, nous pourrions utiliser indistinctement l’un des deux moyens de l’exprimer. Interne, une structure est créée avec deux propriétés en lecture seule: Hasvalue, qui retourne si la variable en question a une valeur et une valeur, qui contient la valeur elle-même.

Il est entendu qu’une variable avec hasard Faux contient la valeur NULL, et si nous essayons d’y accéder via une valeur, une exception sera lancée.

Cependant, le principal avantage qu’ils ont est qu’ils sont utilisés comme s’il s’agissait d’un type de valeur traditionnel. Les types d’annulation se comportent pratiquement comme eux et offrent les mêmes opérateurs, bien qu’ils doivent prendre en compte leurs particularités, comme on peut le voir dans le code suivant:

int?A = 1;
int? b = 2;
int? INTNULO = NULL;
BOOL? Oui = vrai;
bool? Non = faux;
bool? Nisinino = null; console.write (A + B); // 3 console.write (a * innulo); // rien, est nul
console.write (si & Non); // fausse
console.writeline (si & Non); // véritable

ruteline (oui & Nisinino); // rien, est nul
console.write (pas & Nisinino); // fausse
console.write (SI | Nisinino); // véritable

ritine (non | Nisinino); // rien, est null

Nous pouvons créer des types d’annulation de tout type de cadre: int?, flotter?, double ?, Char?, etc.

et en fait, en tant que types de valeur qui sont, nous pouvons également le faire avec des énumérations. L’exemple suivant serait incorrect:

état d’état1 = Status.Correct; état d’état2 = null;

La deuxième ligne provoque l’erreur de compilation « NULL ne peut pas être convertie. dans ‘consoleeplication1.program.state « car c’est un type de valeur ». Logique, est la même que si nous essayions d’affecter la valeur nominale null à un entier.

Cela peut causer une légère inconfort pour la gestion des valeurs « indéterminées », car nous serions nécessaires, par exemple, à Utilisez un autre membre de l’énumération pour représenter cette valeur, comme dans le code suivant dans Visual Basic .NET:

Etat d’énum public à indéterminé = 0 correction = 1
incorrect = 2
FIN ENUM

Cependant, il est parfois plus intéressant de pouvoir avoir une valeur nulle comme une option pour les variables du type de notre énumération. Pour ce faire, nous pouvons utiliser la même syntaxe que nous avons précédemment vue:

‘vb.net
DIM Status1 comme nullable (de l’état) = état.correct
State2 = rien // c #
Etat? State1 = statut.correct;
statut? State2 = null;

Remarque: Cet article est basé sur diverses publications effectuées précédemment sur le blog de l’auteur, José María Aguilar, variable non trouvée

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *