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 :

Déréférencement d'une éventuelle valeur nulle


Sujet :

C#

  1. #1
    Membre chevronné
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 050
    Points : 2 087
    Points
    2 087
    Par défaut Déréférencement d'une éventuelle valeur nulle
    Bonjour tout le monde,

    Bon, je veux bien admettre, si une variable est nulle, l'utilité de la rendre nulle peut ne pas être évidente.

    Toutefois là j'ai un cas qui me rend perplexe. C'est un avertissement, donc ça n'empêche pas de compiler.

    Mais quand même ...

    Nom : Déréférencement valeur nulle Capture d'écran 2023-10-31 234709.png
Affichages : 146
Taille : 76,3 Ko

    D'ailleurs, déréférencement, je veux bien ...
    Ce mot m'évoque surtout
    Or, voilà la ligne, elle ne m'a pas l'air de ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string strPath = Path.Combine(lblCurrentDir.Text, lbxFichiers.SelectedItem.ToString().Split('|')[1].Replace("\n", "").Replace("\r", "").Trim());
    Le soulignement est sur SelectedItem.

    Alors une chose m'intrigue ...
    À quoi sert d'attirer mon attention sur le fait que cette variable n'a pas une valeur nulle ici, si c'est pour tiquer sur le fait que ce que je fais ne peut pas s'appliquer à une valeur nulle ?

    Alors bien entendu la procédure commence par ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                if (lbxFichiers.SelectedIndex == -1)
                {
                    return;
                }
    et ça, bien entendu, de façon à m'assurer que SelectedItem ne puisse pas être nul.

    Il y a encore quelques variantes de ça, à cette heure-ci on va commencer par ça.

    En marge de ça ...
    Une fois que la liste d'erreurs n'apparaissait plus, en personnalisation je ne la trouvais plus, alors j'ai introduit dans le menu "Erreur suivante". Ah oui, ça marche : il semble en effet difficile d'afficher l'erreur suivante sans ouvrir la fenêtre des erreurs.

    C'est comme ça que c'est prévu ?

    J'ai aussi pu ajouter Ligne, dans le menu déboguer, mais je n'ai pas su à quoi ça sert.
    Je l'ai refait pour voir si il y avait une information en bas de la boîte de dialogue.

    Je soupçonne que chercher "Ligne" tout seul dans Bing, ne va pas beaucoup m'éclairer.

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 654
    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 654
    Points : 5 209
    Points
    5 209
    Par défaut
    Ton IDE est à moitié en français et à moitié en anglais.
    C'est la première fois que je vois ça.

    J'ai essayé reproduire ce que tu vois sur ton écran.
    Je n'y arrive pas.
    Notamment je n'ai pas la partie qui dit que ton objet n'a pas la valeur nulle.

    Mais je soupçonne que tu utilises un code repris d'un programme en Framework sur un projet écrit en CORE.
    En Framework 4.8, cette propriété était définie comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [System.ComponentModel.Bindable(true)]
    [System.ComponentModel.Browsable(false)]
    public object SelectedItem { get; set; }
    En CORE 6, elle est définie comme suit (elle explicitement déclarée nullable) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [System.ComponentModel.Bindable(true)]
    [System.ComponentModel.Browsable(false)]
    public object? SelectedItem { get; set; }
    Si tu es certain que cette valeur ne peut pas être nulle, tu peux le spécifier avec l'opérateur !.
    Ce qui devrait donner quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lbxFichiers.SelectedItem!.ToString()
    Ou alors, tu peux te référer à cette doc :
    https://learn.microsoft.com/fr-fr/do...erence-of-null

  3. #3
    Membre chevronné
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 050
    Points : 2 087
    Points
    2 087
    Par défaut
    Bonjour, merci pour la réponse.

    Citation Envoyé par popo Voir le message
    Ton IDE est à moitié en français et à moitié en anglais.
    C'est la première fois que je vois ça.
    En fait, ce qui a dû arriver c'est une mise à jour automatique de .Net en Anglais, alors que Visual Studio est installé avec interface en Français.

    Je suppose que pour que .Net soit en Français il faudrait que je le désinstalle et que je le réinstalle, mais je ne serais pas nécessairement gagnant, vu parfois la tronche des traductions Microsoft.


    J'ai essayé reproduire ce que tu vois sur ton écran.
    Je n'y arrive pas.
    Notamment je n'ai pas la partie qui dit que ton objet n'a pas la valeur nulle.
    En effet, j'imagine que ça n 'aide pas à répondre.

    Mais je soupçonne que tu utilises un code repris d'un programme en Framework sur un projet écrit en CORE.
    En Framework 4.8, cette propriété était définie comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [System.ComponentModel.Bindable(true)]
    [System.ComponentModel.Browsable(false)]
    public object SelectedItem { get; set; }
    En CORE 6, elle est définie comme suit (elle explicitement déclarée nullable) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [System.ComponentModel.Bindable(true)]
    [System.ComponentModel.Browsable(false)]
    public object? SelectedItem { get; set; }
    Je te dis ça dès que je me rappelle dans quel programme j'ai eu ce message

    Si tu es certain que cette valeur ne peut pas être nulle, tu peux le spécifier avec l'opérateur !.
    Ce qui devrait donner quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lbxFichiers.SelectedItem!.ToString()
    Ou alors, tu peux te référer à cette doc :
    https://learn.microsoft.com/fr-fr/do...erence-of-null
    Ah, je dois avouer que je découvre.

  4. #4
    Membre chevronné
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 050
    Points : 2 087
    Points
    2 087
    Par défaut
    C'est un projet qui cible .Net 6.0, celui-là même qui m'a permis de le retrouver.

    J'ai ajouté le point d'exclamation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    string strPath = Path.Combine(lblCurrentDir.Text, lbxFichiers.SelectedItem!.ToString().Split('|')[1].Replace("\n", "").Replace("\r", "").Trim());
    mais il semble que le nombre d'avertissements dans le volet des erreurs n'a pas varié.

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 654
    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 654
    Points : 5 209
    Points
    5 209
    Par défaut
    En fait, ce qui a dû arriver c'est une mise à jour automatique de .Net en Anglais, alors que Visual Studio est installé avec interface en Français.
    Il y a peut de chance que ce soit ça.
    Par ailleurs, en tant que développeur, tu es sensé maîtriser un minimum l'anglais.
    Et comme, tu le dit, les traductions en français sont bancales alors autant utiliser une version US de Visual Studio.
    Un exemple concret dans l'interface en français, il n'y a aucune différence entre "git fetch" et "git pull" (les deux c'est marqué "tirer"). En mode US, tu as les vrais termes, les mêmes qui tu retrouveras dans la doc officielle.

    J'ai ajouté le point d'exclamation mais il semble que le nombre d'avertissements dans le volet des erreurs n'a pas varié.
    Avant tu avais une partie du code soulignée en vert.
    Est-ce que c'est toujours le cas ?

  6. #6
    Membre chevronné
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 050
    Points : 2 087
    Points
    2 087
    Par défaut
    Citation Envoyé par popo Voir le message
    Il y a peut de chance que ce soit ça.
    Par ailleurs, en tant que développeur, tu es sensé maîtriser un minimum l'anglais.
    Et comme, tu le dit, les traductions en français sont bancales alors autant utiliser une version US de Visual Studio.
    Un exemple concret dans l'interface en français, il n'y a aucune différence entre "git fetch" et "git pull" (les deux c'est marqué "tirer"). En mode US, tu as les vrais termes, les mêmes qui tu retrouveras dans la doc officielle.
    En effet, ça craint moins que la doc, mais c'est déjà pas mal.
    Pour la prochaine version je tâcherai d'y penser.

    Avant tu avais une partie du code soulignée en vert.
    Est-ce que c'est toujours le cas ?
    Oui, la partie soulignée est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lbxFichiers.SelectedItem!.ToString()
    Comme avant, quoi.

    Tiens, j'aurais dit que la partie nulle est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lbxFichiers.SelectedItem
    Non ?

    L'essentiel est que ça fonctionne, mais c'est vrai que c'est bien intrigant.

    ***
    D'ailleurs quelques-uns conseillent de désactiver ce contrôle.

    La doc citée est intéressante : il n'y a pas si longtemps j'avais créé un champ booléen a posteriori dans une base de données, et puis je me suis rendu compte que bool ne suffisait pas parce qu'il y avait déjà des données dans la table, et qu'alors ce champ était nul. Alors j'ai converti en int, mais probablement j'aurais eu moins de boulot en déclarant un bool? –et en plus ça aurait pris moins de place.

  7. #7
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 654
    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 654
    Points : 5 209
    Points
    5 209
    Par défaut
    SelectItems renvoie un objet de type object?.
    Il est donc nullable.

    Et puisque tu l'utilise directement (il n'y a pas de Cast), c'est donc la méthode ToString() de object qui est détectée par le compilateur.

    En CORE 6, cette méthode à la signature suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public virtual string? ToString ();
    Tu as donc le même avertissement avec ToString() car le compilateur ne connait pas à l'avance le type de l'objet contenu dans SelectItems.
    Si la la méthode ToString() de cet objet ne peut pas renvoyer null, tu peux utiliser la même technique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lbxFichiers.SelectedItem!.ToString()!.Split('|')[1].Replace("\n", "").Replace("\r", "").Trim()
    Pour le contrôle des valeur nulle, je te conseillerai de ne pas désactiver cette option.
    L'idée est que tu prennent l'habitude de coder avec cette contrainte pour que tu ne sois pas gêné le jour où Microsoft décidera de ne plus la rendre optionnelle mais obligatoire.

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

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 895
    Points : 1 911
    Points
    1 911
    Par défaut
    Citation Envoyé par popo Voir le message
    Un exemple concret dans l'interface en français, il n'y a aucune différence entre "git fetch" et "git pull" (les deux c'est marqué "tirer"). En mode US, tu as les vrais termes, les mêmes qui tu retrouveras dans la doc officielle
    Dans la version que j'ai c'est "Récupérer" (fetch) et "Tirer" (pull).

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

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 895
    Points : 1 911
    Points
    1 911
    Par défaut
    C'est du WinForms ou du WPF ?

  10. #10
    Membre chevronné
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 050
    Points : 2 087
    Points
    2 087
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Dans la version que j'ai c'est "Récupérer" (fetch) et "Tirer" (pull).
    Tiens oui, moi aussi j'ai ça. Il y a effectivement la version anglaise entre parenthèses, ce qui semble judicieux pour des actions aux implications si fortes, d'autant qu'on est susceptible de trouver des docs en Anglais.

    Mon projet est en WinForms.

    Je ne me suis pas mis à WPF, peut-être que je devrais.

  11. #11
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 654
    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 654
    Points : 5 209
    Points
    5 209
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Dans la version que j'ai c'est "Récupérer" (fetch) et "Tirer" (pull).
    Mon expérience de Git dans un Visual Studio en français date un peu (2013).
    Depuis je suis passé à la version US et ne suis jamais revenu sur la version FR (du fait notamment des traduction de l'IntelliSense assez douteuse).
    Je suis ravi de voir qu'il on corrigé depuis mais je ne suis pas prêt de revenir à la version FR pour autant.

    Par exemple, vu hier dans Teams ("Free" traduit en "Gratuit" en lieu et place de "Libre) :
    Nom : MicrosoftTeams-image.png
Affichages : 67
Taille : 8,4 Ko

  12. #12
    Membre chevronné
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 050
    Points : 2 087
    Points
    2 087
    Par défaut
    Citation Envoyé par popo Voir le message
    Mon expérience de Git dans un Visual Studio en français date un peu (2013).
    Oh la la, Git en 2013, je trouvais qu'il fallait "s'accrocher".

    Il faudra que je revienne, parce que là le mieux que j'ai à faire c'est de dormir.

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/06/2021, 10h37
  2. [vb.net] tester une valeur nulle de maniere elegante
    Par graphicsxp dans le forum Windows Forms
    Réponses: 5
    Dernier message: 22/08/2005, 16h36
  3. Comment gérer les valeur Nulles dans une requête ?
    Par sondo dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/03/2005, 12h02
  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, 16h02
  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, 21h52

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