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

VB.NET Discussion :

Nothing ou ""


Sujet :

VB.NET

  1. #1
    Membre Expert Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 699
    Par défaut Nothing ou ""
    Salut,

    Juste une petite question ou j'arrive pas a trouver le meilleur.
    Vaut-il mieux utiliser Nothing ou "" ???

    Je sais je cherche la petite bete, mais bon tant qu'a faire, autant faire bien

  2. #2
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Citation Envoyé par Danyel
    Salut,

    Juste une petite question ou j'arrive pas a trouver le meilleur.
    Vaut-il mieux utiliser Nothing ou "" ???

    Je sais je cherche la petite bete, mais bon tant qu'a faire, autant faire bien
    C'est pas si c'est mieux ou pas ca dépend de ta variable.

    Nothing c'est pour détruire un objet et "" c'est pour "détruire" une chaine de caractère.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim Obj as new ArrayList
    Obj = Nothing 'detruit le tableau
     
    Dim PassWord as String = "toto"
    PassWord = nothing 'a aucun sens ! et genèrera une erreur il faut faire :
    PassWord = ""
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  3. #3
    Membre Expert Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 699
    Par défaut
    Citation Envoyé par Aspic
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PassWord = nothing 'a aucun sens ! et genèrera une erreur
    Hmmm es-tu vraiment sur de cela, car mettre nothing à un string ne provoque pas d'erreur meme en explicit et strict sur ON.
    Alors oui Nothing est de type object, mais realise la meme chose que "" à des chaines ou nombres ...
    idem pour string.text = nothing !!!

  4. #4
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Pour ce genre de questions existencielles , il y a la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String.IsNullOrEmpty(string)
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    mettre un string à nothing n'est pas forcément utile, car string est certes un objet mais reste différent des vrais objets
    il sera bien désinstancié automatiquement comme les types par valeurs, meme sans le mettre à nothing ou à ""
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par Danyel
    Alors oui Nothing est de type object, mais realise la meme chose que "" à des chaines ou nombres ...
    idem pour string.text = nothing !!!
    Affecter String.Empty ou null à une chaine n'a pas du tout le même résultat. Dans beaucoup de situations, la distinction est importante entre une variable non initilialisée (cad null) et une variable contenant une chaine vide. Il y a cette même distinction dans les champs d'une table d'un SGBD.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    dans un sgbd la différence est souvent stricte en effet
    mais en vb.net, un string non initialisé est à nothing, mais il est aussi = à ""
    enfin dim s as string => (s = "") renvoie true
    par contre, assigné à "" il n'est plus nothing
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Par défaut
    mais en vb.net, un string non initialisé est à nothing, mais il est aussi = à ""
    Moi, je n'en suis pas si sur. Nothing ou la chaine sont bien deux valeurs distinctes. La chaine vide n'est pas la même chose que RIEN.

    ATTENTION : toute variable doit être initialisée avant utilisation (c'est un principe fondamental de la programmation) car normalement on ne peut pas prévoir la valeur que notre variable aura avant .... Donc ton exemple repose sur un état ambigüe.

    Et tu réponds toi même à la question
    par contre, assigné à "" il n'est plus nothing
    Nothing <> ""

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    j'ai pas dit que nothing = ""
    j'ai dit qu'un string non initialisé est à nothing
    dim s as string
    s is nothing renvoie true
    mais il est aussi vide
    s = "" renvoie true
    je l'ai testé je dis pas nimp

    et sinon vb initialise les variables de types par valeur, un integer sera = à 0 au début du prog, et ce depuis plusieurs génération de vb au moins (pas le cas sur tous les langages en effet)
    le but d'un logiciel c'est de faire les choses à la place de quelqu'un, initilialiser les variables non objets est une chose que je trouve normal de la part d'une technologie de développement
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Par défaut
    et sinon vb initialise les variables de types par valeur, un integer sera = à 0 au début du prog, et ce depuis plusieurs génération de vb au moins (pas le cas sur tous les langages en effet)
    Il n'a jamais été conseillé de laisser au compilateur décider. Mieux vaut écrire le code de manière explicite puisque le jour ou le compilateur change, et bien c'est la m.... Petit exemple : VB depuis plusieurs génération avait comme passage de paramètre par défaut, ByRef, ce qui n'est plus le cas dans VB.NET. Quand tu n'as pas pris soin d'écrire explicitement les Byref et Byval, le passage d'un compilateur à l'autre pose des problèmes

    Et logiquement si :
    s is nothing renvoie true
    et
    s = "" renvoie true
    alors
    Nothing = "" ou Nothing Is ""

    Ce qui a priori est FAUX donc l'état de départ de s est ambigüe.

    De plus un programme travaille rarement sur des variables n'ayant jamais reçu de valeur (tout juste créées) et lorsque l'on a assigné une valeur à s, VB différencie le Nothing et la chaine vide.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    l'ambiguité vient de vb, microsoft fait bien les choix qu'il veut sur ses logiciels
    et donc apparement le fait qu'un string = "" alors qu'il est nothing vient du fait que c'est un semi objet et donc = et is ne pointe pas sur la meme chose

    quand on change de compilateur il est rarement conseillé de garder le meme code, et de toute facon c'est rarement le cas puisque c'est rarement possible de changer de compilateur
    donc si le compilateur marche d'une certaine manière, autant l'utiliser de la manière dont il fonctionne
    vb est depuis le début un langage qui essaie de simplifier les choses

    le but d'un programme est de faire abstraction de comment les choses se passent en amont, vb va dans ce sens là, moi ca me va, je n'irais pas dire que mon integer est = à 0 ! lol
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre émérite
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Par défaut
    Dans un cas, la variable n'a pas de référence. C'est à dire qu'aucune mémoire n'est allouée à la variable. Dans l'autre cas, de la mémoire est allouée à la variable, mais ne contient pas de valeurs

    Dans le cas suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonString = Nothing
    MonString n'a pas de référence, donc si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonString = MonString.ToUpper
    cela ne fonctionnera pas.

    Dans la cas suivant :

    MonString sera référencé.
    En fait c'est come si tu affecté un tableau de caractère vide à la variable
    MonString = "" => MonString = Tableau de caractère avec aucun caractère...

    Si tu fais,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonString = MonString.ToUpper
    Cela fonctinnera, même si le tableau de caractère est vide..

    J'espère avoir été clair, car c'est pas évident à expliquer, d'autant que VS considère que "" = Nothing, au même titre que 0 = Nothing ou #1/1/1# = Nothing

  13. #13
    Membre émérite
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Par défaut
    En fait pour répondre à la question ...

    Si tu veux initialiser une variable String, tu dois faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonString = "" ' Equivaut à MonString = New String(Chr(0), 0)
    au même titre que n'importe quel objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonObject = New Object
    Si tu veux détruire un objet String

    au même titre que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonObjet = nothing

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    monString = System.String.Empty
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  15. #15
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Pourquoi se prendre la tete sur ce sujet ?

    Sincerement pour moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MonString = ""
    MonObjet = nothing
    Et c'est tout
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  16. #16
    Membre émérite
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Par défaut
    Tout simplement parce que ce n'est pas la même chose ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Dim i As String
     
    i = Nothing
    MsgBox(IsNothing(i)) ' Renvoi True
     
    i = ""
    MsgBox(IsNothing(i)) ' Renvoi False

  17. #17
    Membre Expert Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 699
    Par défaut
    lol qui aurait pu croire que j'allais mettre le feu avec ma question à la c..

    En tout cas, ca prouve bien vu tous les commentaires pour et contre, qu'il y a sujet à discussion.

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