1
votes

pourquoi les chaînes nullables n'ont-elles pas de méthode hasValue ()?

J'ai une classe qui contient des chaînes Nullable, je veux faire une vérification pour voir si elles restent nulles ou si quelqu'un les a définies.

Similaire aux chaînes, la classe contient des entiers qui sont nullables, où je peux effectuer cette vérification en faisant une comparaison d'égalité avec la méthode .HasValue () - il semble que les chaînes n'ont pas cela?

Alors, comment vérifier si cela va de null à notNull?

public class Test 
{
    public string? a
    public string? b
    public int? c
} 

var oldQ = new Test(c=123)
var newQ = new Test(c=546)

bool isStilValid = newQ.c.HasValue() == oldQ.c.HasValue() //(this is not possible?)&& newQ.b.HasValue() == oldQ.b.HasValue()

pourquoi n'est-ce pas possible?


9 commentaires

Utilisez s == null et s! = Null ?


@kafka Pour le contrôle nul de la chaîne, vous pouvez utiliser string.IsNullOrEmpty ().


je veux vérifier si ça passe de sans valeur à a de la valeur


Aucun type de référence n'a HasValue . Seuls les types valeur nullables ont une telle chose.


Même pour les types de valeur Nullable, vous n'utilisez généralement pas / ne devriez pas utiliser .HasValue . Teste l '(in) égalité avec null .


Vous pouvez toujours créer votre propre extension HasValue


Il n'y a pas de string? dans la version c # inférieure à 8 . Utilisez-vous c # 8 ?


HasValue et Value sont des propriétés , pas des méthodes donc invoquer .HasValue () le ferait se tromper de toute façon


une chaîne est un objet et non un nullable


3 Réponses :


1
votes

La propriété HasValue appartient à Nullable struct, où T est également limité à un type valeur uniquement. Ainsi, HasValue n'existe que pour les types valeur.

Les types référence Nullable sont implémentés à l'aide d'annotations de type, vous ne pouvez pas utiliser la même approche avec les types valeur Nullable. Pour vérifier la nullité d'un type de référence, vous pouvez utiliser la comparaison avec null ou méthode IsNullOrEmpty (pour les chaînes uniquement). Ainsi, vous pouvez réécrire un peu votre code

bool isStilValid = (newQ.b != null) == (oldQ.b != null);

Ou simplement utiliser une comparaison régulière avec null

var oldQ = new Test() { c = 123 };
var newQ = new Test() { c = 456 };

bool isStilValid = string.IsNullOrEmpty(newQ.b) == string.IsNullOrEmpty(oldQ.b);


5 commentaires

@phuzi Techniquement, les propriétés sont des méthodes.


@ SᴇM: Les propriétés ne sont pas des méthodes. Les propriétés sont implémentées comme une paire de méthodes , mais c'est un détail d'implémentation. Les propriétés et les méthodes sont toutes deux des membres .


@EricLippert Le mot-clé était "Techniquement" .


Permet d'explorer plus loin. Les événements sont-ils «techniquement des méthodes»? Supposons qu'un getter de propriété soit inséré 100% du temps dans un accès de champ. Est-ce donc "techniquement une méthode"? Je suis intéressé à en savoir plus sur votre système de croyance.


@EricLippert Je suis très touché par votre intérêt pour mon "système de croyance", mais je ne vais pas le développer ici. Je ne dis pas que les propriétés sont des méthodes et en disant "techniquement" - je voulais dire qu'elles étaient implémentées en interne en tant que méthodes (définir et obtenir la méthode en interne provoquent un appel de méthode ) . De plus, si quelqu'un pense que j'ai dit quelque chose de mal, je suis ouvert à la discussion / correction d'une «manière de discussion appropriée».



0
votes

L'équivalent par rapport à null serait:

bool isStillValid = (newQ.c != null) == (oldQ.c != null) && (newQ.b != null) == (oldQ.b != null);

C'est l'équivalent de votre code d'origine, mais je ne suis pas sûr que le code d'origine soit correct. .

isStillValid sera vrai si TOUS les éléments testés pour null sont en fait null. Est-ce vraiment ce que vous vouliez?

Autrement dit, si newQ.c est nul et oldQ.c est nul et newQ.b est nul et oldQ.b est nul, alors isStillValid sera true.


0 commentaires

0
votes

Le type Nullable nécessite un type T qui est un type de valeur non nullable, par exemple int ou double . Les variables typées string sont déjà nulles, donc la variable typée chaîne nullable n'a pas de sens.

Vous devez utiliser string.IsNullOrEmpty ou simplement null


0 commentaires