OVH Cloud OVH Cloud

Mot clé New

7 réponses
Avatar
Pierre Gard
Bonjour,

Parfois pour instancier un objet, il faut mettre le mot clé new, parfois
pas.

exemple dim test as new mailboxes

parfois ceci suffit dim test as mailboxes.

Quelle est la différence et comment savoir si le mot clé new est
indispensable ou non ?

D'avance merci de vos explications

Pierre

--

7 réponses

Avatar
Bismark Prods
Mon Cher Pierre,

C'est assez simple à vrai dire :
Dim test As MailBox 'Création d'un espace mémoire pour un objet MailBox (Dim
= Dimension)
Dim text As new MailBox 'LateBinding, Création d'un espace pour un objet
*Object* puis initialisation pour une instance d'un nouveau MailBox

Le seul endroit ou tu peux utiliser un objet sans l'initialiser, est lorsque
tu as des structures de type tel que Int32, etc...

Bonne soirée

Bismark


"Pierre Gard" a écrit dans le message
de news:udhgU%
Bonjour,

Parfois pour instancier un objet, il faut mettre le mot clé new, parfois
pas.

exemple dim test as new mailboxes

parfois ceci suffit dim test as mailboxes.

Quelle est la différence et comment savoir si le mot clé new est
indispensable ou non ?

D'avance merci de vos explications

Pierre

--





Avatar
Pierre Alexis [MVP]
Salut Bismark Prods,

Tu as écrit :

C'est assez simple à vrai dire :
Dim test As MailBox 'Création d'un espace mémoire pour un objet MailBox (Dim
= Dimension)



Création d'un espace mémoire ? Huh ? avec cette ligne il n'y a pas
d'allocation sur le heap, mais uniquement allocation d'une référence sur le
stack...

Dim text As new MailBox 'LateBinding, Création d'un espace pour un objet
*Object* puis initialisation pour une instance d'un nouveau MailBox



Là il y a à la fois création de la référence sur le stack et de l'objet sur le
heap.

Le seul endroit ou tu peux utiliser un objet sans l'initialiser, est lorsque
tu as des structures de type tel que Int32, etc...



Initialiser ? Huh ? Je peux me tromper, mais j'ai l'impression que tu mélanges
un peu les concepts... Regarde mon autre post, pour vois si ma réponse est
bien ce que tu voulais exprimer ;-).

--
Pierre ALEXIS - MVP Visual Basic Classique
Courriel & messenger :
FAQ Visual Basic : http://faq.vb.free.fr/
Avatar
Pierre Alexis [MVP]
Salut Pierre,

Tu as écrit :

Parfois pour instancier un objet, il faut mettre le mot clé new, parfois
pas.

exemple dim test as new mailboxes

parfois ceci suffit dim test as mailboxes.

Quelle est la différence et comment savoir si le mot clé new est
indispensable ou non ?



La différence réside dans le type d'objet que tu veux instancier. On en
distingue fondamentalement deux types d'objet :

- Les objets ayant un type "Valeur"
- Les objets ayant un type "Référence"

La différence entre les deux ? Les premiers sont alloués sur le Stack et sont
accessibles "directement". Les seconds sont alloués sur le Heap et sera alloué
sur le Stack une (ou plusieurs) "référence" permettant de retrouver l'objet
sur le Heap (donc dans ce cas, l'objet n'est pas accessible directement, il y
a un niveau d'indirection).
Comment savoir si un type est "Valeur" ou "Référence" ? En fait en .Net, tous
les types valeurs dérivent automatiquement de la classe "ValueType". Tous les
autres objets ne dérivant pas de cette classe sont de type "Référence". Parmis
les types valeurs on compte les Integer, les Double, les Boolean, les
DateTime, les Byte, les structures, etc...).

Alors le comportement de l'instanciation est différent selon que l'on à
affaire à un type "Valeur" ou un type "Référence". Dans le cas d'un type
valeur, si tu écris :

Dim test As Integer

Sera directement alloué sur le stack la place nécessaire pour stocker ton
entier. Maintenant dans le cas d'un type référence, si tu écris :

Dim test As System.Collections.SortedList

Sera alloué sur le Stack une référence vers un objet de type
"System.Collections.SortedList" se trouvant sous le Heap. Après avoir écrit
cette unique ligne de code, la référence ne "pointe" encore vers aucun objet.
Il faut en effet encore demander la création de cet objet, et l'assigner à la
référence. Et pour faire cela tu vas écrire :

test = New System.Collections.SortedList

Maintenant la référence "test" pointe vers le nouvel objet situé sur le Heap.
Pour être complet, ajoutons que Visual Basic permet une syntaxe simplifiée des
deux lignes de codes précédentes :

Dim test As New System.Collections.SortedList

est équivalent à

Dim test As System.Collections.SortedList
test = New System.Collections.SortedList

est équivalent à

Dim test As System.Collections.SortedList = New System.Collections.SortedList

Donc comme tu peux le constater, le "New" sert à créer un objet sur le Heap et
n'a donc pas d'application dans le cas d'un objet de type "Valeur".

Il existe cependant une exception à tout ce que je viens de dire : le type
String. Bien qu'il s'agisse d'un type "Référence", on peut créer un sring sans
avoir à faire appel au mot-clé "New" (d'ailleurs on ne peut pas) :

Dim test As String

Voilà, j'espère que mes explications auront été assez claires ;-)

--
Pierre ALEXIS - MVP Visual Basic Classique
Courriel & messenger :
FAQ Visual Basic : http://faq.vb.free.fr/
Avatar
Bismark Prods
A quelle heure est-ce que j'ai posté ?


"Pierre Alexis [MVP]" a écrit dans le message de
news:%
Salut Bismark Prods,

Tu as écrit :

> C'est assez simple à vrai dire :
> Dim test As MailBox 'Création d'un espace mémoire pour un objet MailBox


(Dim
> = Dimension)

Création d'un espace mémoire ? Huh ? avec cette ligne il n'y a pas
d'allocation sur le heap, mais uniquement allocation d'une référence sur


le
stack...

> Dim text As new MailBox 'LateBinding, Création d'un espace pour un objet
> *Object* puis initialisation pour une instance d'un nouveau MailBox

Là il y a à la fois création de la référence sur le stack et de l'objet


sur le
heap.

> Le seul endroit ou tu peux utiliser un objet sans l'initialiser, est


lorsque
> tu as des structures de type tel que Int32, etc...

Initialiser ? Huh ? Je peux me tromper, mais j'ai l'impression que tu


mélanges
un peu les concepts... Regarde mon autre post, pour vois si ma réponse est
bien ce que tu voulais exprimer ;-).

--
Pierre ALEXIS - MVP Visual Basic Classique
Courriel & messenger :
FAQ Visual Basic : http://faq.vb.free.fr/




Avatar
Pierre Alexis [MVP]
Salut Bismark Prods,

Tu as écrit :

A quelle heure est-ce que j'ai posté ?



LOL Je me disais aussi :-D Je comprenais pas ;-) (avec ou sans alcool ? :-p)

--
Pierre ALEXIS - MVP Visual Basic Classique
Courriel & messenger :
FAQ Visual Basic : http://faq.vb.free.fr/
Avatar
Bismark Prods
Jamais d'alcool, mais 80heures sans dormir...

C'est la folie en ce moment ! ... Pour ceux que ca intéresse, je suis en
plein dans un projet très intéressant concernant IPI / IBAN (OCR de PDF417).

Bismark

"Pierre Alexis [MVP]" a écrit dans le message de
news:
Salut Bismark Prods,

Tu as écrit :

> A quelle heure est-ce que j'ai posté ?

LOL Je me disais aussi :-D Je comprenais pas ;-) (avec ou sans alcool ?


:-p)

--
Pierre ALEXIS - MVP Visual Basic Classique
Courriel & messenger :
FAQ Visual Basic : http://faq.vb.free.fr/




Avatar
Zazar
Bonjour,

La différence réside dans le type d'objet que tu veux instancier. On en
distingue fondamentalement deux types d'objet :

- Les objets ayant un type "Valeur"
- Les objets ayant un type "Référence"

La différence entre les deux ? Les premiers sont alloués sur le Stack et


sont
accessibles "directement". Les seconds sont alloués sur le Heap et sera


alloué
sur le Stack une (ou plusieurs) "référence" permettant de retrouver


l'objet
sur le Heap (donc dans ce cas, l'objet n'est pas accessible directement,


il y
a un niveau d'indirection).



En fait, la vraie différence n'est pas l'endroit où sont stockées les
variables, mais c'est qu'une variable d'un type valeur contient directement
ses données, tandis qu'une variable de type réfèrence contient une réfèrence
vers ses données (qu'on appelle alors objet). Ceci implique qu'il est
possible d'avoir plusieurs variables qui réfèrencent le même objet et alors
les opérations sur une variable affectent aussi l'objet référencé par les
autres variables. Au contraire, avec les types valeurs, les variables ont
chacune leurs propres données, et une opération sur les données "directes"
d'une variable n'affecte pas l'autre. (Je parle de données directes, car si
les 2 variables sont des structures par exemple, elles peuvent avoir un
champ de type réfèrence qui pointent vers le même objet).
Pour revenir à ce que vous dîtes, il est vrai qu'une variable locale de type
valeur a ses données stockées sur la pile, et qu'une variable de type
réfèrence a ses données stockées sur le tas. Mais dans le cas général, ce
n'est pas forcément vrai.

--
Zazar