OVH Cloud OVH Cloud

IsNothing() ou = Nothing ?

5 réponses
Avatar
{{ Olivier }}
Bonjour

y a t'il une différence entre ces deux espressions ?

If Not maDate = Nothing Then ...

If Not IsNothing(maDate) Then ...


Merci
Olivier

5 réponses

Avatar
**Pierre**
Bonjour,

En VB, c'est la même chose mais si vous mettez Option Strict On vous aurez
un message d'erreur pour If Not maDate = Nothing Then ...

--
Pierre
"{{ Olivier }}" a écrit dans le message de
news:
Bonjour

y a t'il une différence entre ces deux espressions ?

If Not maDate = Nothing Then ...

If Not IsNothing(maDate) Then ...


Merci
Olivier




Avatar
Zoury
Salut Olivier ! :O)

y a t'il une différence entre ces deux espressions ?



Oui... mais dans ce cas le résultat sera le même.


If Not maDate = Nothing Then ...



AMHA, cette expression n'a pas vraiment de sens... du moins en VB.
J'vais tenter de d'expliquer mon point de vue. :O)


Une référence est un pointeur.
Elle peut soit pointer sur une instance de classe en mémoire (référence non
nulle), soit ne *pas* pointer sur une instance de classe (référence nulle).
Le mot clé Nothing sert à désigner l'état d'une référence.
Les types valeur (Int32, DateTime, Single, etc) sont des *structures* et ne
sont pas considéré comme des objets.
Ils ne peuvent donc pas être nul.

Voici un extrait de la documentation de la classe ValueType dont hérite les
types valeur :
"Les types de données se divisent en types valeur et en types référence. Les
types valeur sont soit alloués par des piles, soit alloués inline dans une
structure. Les types référence sont alloués par des tas. Les types valeur et
référence dérivent de la classe de base fondamentale Object. Au cas où un
type valeur doit se comporter comme un objet, un wrapper faisant ressembler
un type valeur à un objet de référence est alloué sur le tas et la valeur du
type valeur y est copiée. Ce wrapper est marqué pour que le système sache
qu'il contient un type valeur. Ce processus porte le nom de conversion
boxing et le processus inverse, de conversion unboxing. Les conversions
boxing et unboxing permettent à n'importe quel type d'être traité comme un
objet."

Maintenant, si on considère l'état nul en soit, ça revient presqu'au concept
"d'être ou ne pas être" d'Hamlet.
Si tu n'es pas, tu n'existes pas.
Si tu n'existes pas, tu ne peux pas égaler quoi que soit, sinon ça
impliquerait que tu existes vu que tu égales quelque chose.

C'est pourquoi, amha, employer l'opérateur d'égalité avec Nothing n'a pas de
sens et employer Nothing avec un type valeur n'a pas de sens non plus, car
il ne s'agit pas d'une référence, et ne peut donc pas avoir l'état nul
(pointer nul part).


Je suspecte le code compile et fonctionne parce que une des implémentations
de l'opérateur d'égalité (=) des types valeur accepte un type Object. Ainsi,
non n'obtenons pas d'erreur de compilation pour cause de type non
compatible.


C'est pourquoi je crois qu'afin de tester si une référence est nulle et
d'éviter toute ambiguïté, on devrait toujours employer l'expression Is
Nothing ou la fonction IsNothing() :
'***
If Not IsNothing(monObjet) Then
'ou
If Not monObjet Is Nothing Then
'***


--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
[[ Olivier ]]
Oui mais alors dans le cas des dates ?

Par exemple pour un Employé, la Date de sortie n'est pas renseigné et est
donc dans la base de donnée en NULL
Comment faire pour affecter une valeur NULL (ou autre chose NOTHING) a ma
propriété DateSortie As Date de mon objet Employe ?
pour pouvoir ensuite la tester ?

Actuellement je fais
if Not DateSortie = Nothing

et ca marche quand même ?

Merci
Olivier



"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:
Salut Olivier ! :O)

y a t'il une différence entre ces deux espressions ?



Oui... mais dans ce cas le résultat sera le même.


If Not maDate = Nothing Then ...



AMHA, cette expression n'a pas vraiment de sens... du moins en VB.
J'vais tenter de d'expliquer mon point de vue. :O)


Une référence est un pointeur.
Elle peut soit pointer sur une instance de classe en mémoire (référence
non
nulle), soit ne *pas* pointer sur une instance de classe (référence
nulle).
Le mot clé Nothing sert à désigner l'état d'une référence.
Les types valeur (Int32, DateTime, Single, etc) sont des *structures* et
ne
sont pas considéré comme des objets.
Ils ne peuvent donc pas être nul.

Voici un extrait de la documentation de la classe ValueType dont hérite
les
types valeur :
"Les types de données se divisent en types valeur et en types référence.
Les
types valeur sont soit alloués par des piles, soit alloués inline dans une
structure. Les types référence sont alloués par des tas. Les types valeur
et
référence dérivent de la classe de base fondamentale Object. Au cas où un
type valeur doit se comporter comme un objet, un wrapper faisant
ressembler
un type valeur à un objet de référence est alloué sur le tas et la valeur
du
type valeur y est copiée. Ce wrapper est marqué pour que le système sache
qu'il contient un type valeur. Ce processus porte le nom de conversion
boxing et le processus inverse, de conversion unboxing. Les conversions
boxing et unboxing permettent à n'importe quel type d'être traité comme un
objet."

Maintenant, si on considère l'état nul en soit, ça revient presqu'au
concept
"d'être ou ne pas être" d'Hamlet.
Si tu n'es pas, tu n'existes pas.
Si tu n'existes pas, tu ne peux pas égaler quoi que soit, sinon ça
impliquerait que tu existes vu que tu égales quelque chose.

C'est pourquoi, amha, employer l'opérateur d'égalité avec Nothing n'a pas
de
sens et employer Nothing avec un type valeur n'a pas de sens non plus, car
il ne s'agit pas d'une référence, et ne peut donc pas avoir l'état nul
(pointer nul part).


Je suspecte le code compile et fonctionne parce que une des
implémentations
de l'opérateur d'égalité (=) des types valeur accepte un type Object.
Ainsi,
non n'obtenons pas d'erreur de compilation pour cause de type non
compatible.


C'est pourquoi je crois qu'afin de tester si une référence est nulle et
d'éviter toute ambiguïté, on devrait toujours employer l'expression Is
Nothing ou la fonction IsNothing() :
'***
If Not IsNothing(monObjet) Then
'ou
If Not monObjet Is Nothing Then
'***


--
Cordialement
Yanick
MVP pour Visual Basic




Avatar
Zoury
> Par exemple pour un Employé, la Date de sortie n'est pas renseigné et est
donc dans la base de donnée en NULL



Tu reçois un type DBNull ?

Comment faire pour affecter une valeur NULL (ou autre chose NOTHING) a ma
propriété DateSortie As Date de mon objet Employe ?
pour pouvoir ensuite la tester ?



Personnellement, lorsque je dois faire en sorte qu'une date soit considérée
comme NULL, je lui affecte la valeur DateTime.MinDate.
Ensuite le test est facile à faire :
'***
If (DateSortie > DateTime.MinDate) Then
' non null
End If
'***


Actuellement je fais
if Not DateSortie = Nothing
et ca marche quand même ?



Tu peux nous montrer un exemple de ton code ? Comment affectes-tu la valeur
NULL reçu de la BD à ta variable DateSortie ?

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
{ Olivier }
>> Tu peux nous montrer un exemple de ton code ? Comment affectes-tu la
valeur
NULL reçu de la BD à ta variable DateSortie ?





Ben justement je fais rien :-)
Avec ce code : si c'est dbnull, je ne mets "rien" dans ma propriété

If Not IsDbNull(dr("sortie_date") then
' non null
Else
' ici y a rien, pas de code !
End If

et ensuite plus loin je test alors avec :

If Not maDate = Nothing Then ...
ou
If Not IsNothing(maDate) Then ...

Et ca fonctionne , peut être avec de la chance mais .. ?

Merci
Olivier




"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:
Par exemple pour un Employé, la Date de sortie n'est pas renseigné et est
donc dans la base de donnée en NULL



Tu reçois un type DBNull ?

Comment faire pour affecter une valeur NULL (ou autre chose NOTHING) a ma
propriété DateSortie As Date de mon objet Employe ?
pour pouvoir ensuite la tester ?



Personnellement, lorsque je dois faire en sorte qu'une date soit
considérée
comme NULL, je lui affecte la valeur DateTime.MinDate.
Ensuite le test est facile à faire :
'***
If (DateSortie > DateTime.MinDate) Then
' non null
End If
'***


Actuellement je fais
if Not DateSortie = Nothing
et ca marche quand même ?



Tu peux nous montrer un exemple de ton code ? Comment affectes-tu la
valeur
NULL reçu de la BD à ta variable DateSortie ?

--
Cordialement
Yanick
MVP pour Visual Basic