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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 913
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 913
    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 : 450
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 984
    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 984
    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 émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 913
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 913
    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 émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 913
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 913
    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 984
    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 984
    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 émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 913
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 913
    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
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    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).

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/06/2021, 09h37
  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, 15h36
  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, 11h02
  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