IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Vérification d'une valeur null


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2015
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2015
    Messages : 90
    Points : 98
    Points
    98
    Par défaut Vérification d'une valeur null
    Bonjour,

    Je débute en c# et j'aimerais contourner un problème qui ma foi est peu handicapant mais ennuyant à la longue.

    Imaginons que nous avons un objet appelé 'Maison' et que cet objet a une propriété qui est elle-même un objet appelé Porte. Cet objet Porte a elle-même différente caractéristique comme par exemple 'hauteur'.

    Pourquoi doit-on obligatoirement regarder dans une condition que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Maison.Porte != null && Maison.Porte.Hauteur != null
    Et pas tout simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Maison.Porte.Hauteur != null
    Je comprend le procédé réalisé par la machine derrière lors de l’exécution et le besoin de procédé de la première manière, mais n'y a-t-il pas un moyen de le contourner car lorsque l'on a un embriquement d'objet assez conséquent, cela pour devenir assez lourd à écrire ?

    D'avance merci pour vos réponses,
    Wazzouille

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Tu peux toujours t'assurer que la porte soit créée dans le constructeur de la maison ou bien lorsque tu la déclare.
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Maison
    {
        public Porte Porte { get; private set; }
     
        public Maison()
        {
            Porte = new Porte();
        }
    }

    ou

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Maison
    {
        Porte porte = new Porte();
        public Porte Porte
        {
             get { return porte; }
         }
     }

    Mais si laisse libre accès à cette propriété, tu ne peux pas empêcher le consommateur de ta classe de libérer cet Objet.

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    parce que si porte est null ca revient à écrire null.hauteur ce qui plante

    par contre il y a une syntaxe qui va te convenir c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (Maison.Porte?.Hauteur != null)
    un ? derrière quelque chose permet de renvoyer null sans tester la suite
    on peut en enchainer plusieurs genre Maison?.Porte?.Hauteur
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    La propriété Hauteur de ta Porte devrait être un float, double ou même int, qui sont des types valeur, donc non nullable par défaut. Sinon pour ton problème C#6 introduit justement l'opérateur ?. qui vérifie que l'objet sur lequel on appelle une méthode est bien instancié avant de faire l'appel, et renvoie null sinon ; à combiner avec l'opérateur ?? qui fait un null check sur l'objet passé avant et permet de proposer une valeur de remplacement.

    Si mon logger n'est pas null, je logge mon message, sinon c'est ignoré :
    Si mon item n'a pas d'enfants, je renvoie un tableau vide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public IEnumerable<Item> Children { get { return _children ?? new Item[0]; } }
    On peut chaîner les ?. et renvoyer une valeur par défaut au besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var hauteur = maison?.Porte?.Hauteur ?? 0.0;
    On peut faire de l'initialisation paresseuse avec ces opérateurs ; si mon objet est null, je l'initialise avant de le renvoyer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public List<Item> Items { get { return _items ?? (_items = new List<Item>())); } }
    Pour terminer, je dirais que tu peux aussi avoir une approche un peu "conservative" dans certains cas. Si un objet a une propriété sensée être initialisée à tout moment, ce n'est pas la peine de faire un null check : si la propriété est nulle à un moment ou un autre, c'est qu'il y a un bug quelque part ; tu as alors vraiment envie que ton application casse pendant ton debug, afin d'être informé de l'existence de ce bug.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2015
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2015
    Messages : 90
    Points : 98
    Points
    98
    Par défaut
    le Maison?.Porte?.Hauteur est exactement ce qu'il me fallait

    Merci pour vos réponses !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [vb.net] tester une valeur nulle de maniere elegante
    Par graphicsxp dans le forum Windows Forms
    Réponses: 5
    Dernier message: 22/08/2005, 15h36
  2. Réponses: 3
    Dernier message: 10/08/2005, 11h11
  3. Inserer une valeur NULL dans un champ datetime
    Par Karibou dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 10/08/2005, 10h58
  4. Affcecter une valeur NULL dans une requete paramétrée
    Par thiouwz2 dans le forum Bases de données
    Réponses: 7
    Dernier message: 05/11/2004, 15h02
  5. Passer une valeur Null dans un argument de procédure
    Par preempalver dans le forum VBA Access
    Réponses: 5
    Dernier message: 30/12/2003, 20h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo