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 :P
Version imprimable
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 :P
C'est pas si c'est mieux ou pas ca dépend de ta variable.Citation:
Envoyé par Danyel
Nothing c'est pour détruire un objet et "" c'est pour "détruire" une chaine de caractère.
Exemple :
Code:
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 = ""
Hmmm es-tu vraiment sur de cela, car mettre nothing à un string ne provoque pas d'erreur meme en explicit et strict sur ON.Citation:
Envoyé par Aspic
Alors oui Nothing est de type object, mais realise la meme chose que "" à des chaines ou nombres ...
idem pour string.text = nothing !!!
Pour ce genre de questions existencielles ;) , il y a la méthode :
Code:String.IsNullOrEmpty(string)
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 à ""
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.Citation:
Envoyé par Danyel
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
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.Citation:
mais en vb.net, un string non initialisé est à nothing, mais il est aussi = à ""
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
Nothing <> ""Citation:
par contre, assigné à "" il n'est plus nothing
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
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 ;)Citation:
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)
Et logiquement si :
etCitation:
s is nothing renvoie true
alorsCitation:
s = "" renvoie true
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.
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
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 :
MonString n'a pas de référence, donc si tu faisCode:
1
2MonString = Nothing
cela ne fonctionnera pas.Code:
1
2 MonString = MonString.ToUpper
Dans la cas suivant :
MonString sera référencé.Code:
1
2MonString = ""
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,
Cela fonctinnera, même si le tableau de caractère est vide..Code:
1
2 MonString = MonString.ToUpper
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
En fait pour répondre à la question ...
Si tu veux initialiser une variable String, tu dois faire
au même titre que n'importe quel objet.Code:
1
2 MonString = "" ' Equivaut à MonString = New String(Chr(0), 0)
Si tu veux détruire un objet StringCode:
1
2 MonObject = New Object
au même titre queCode:MonString = Nothing
Code:
1
2MonObjet = nothing
ou encore
Code:
1
2 monString = System.String.Empty
Pourquoi se prendre la tete sur ce sujet :mouarf: ?
Sincerement pour moi :
Et c'est tout ;)Code:
1
2 MonString = "" MonObjet = nothing
Tout simplement parce que ce n'est pas la même chose ...:mrgreen:
Code:
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
lol qui aurait pu croire que j'allais mettre le feu avec ma question à la c.. :yaisse2:
En tout cas, ca prouve bien vu tous les commentaires pour et contre, qu'il y a sujet à discussion.