Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
--
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" <pharmasoftsupprimerceci@tvs2net.ch> a écrit dans le message
de news:udhgU%23hgEHA.1356@TK2MSFTNGP09.phx.gbl...
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 ?
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
--
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 ;-).
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 ;-).
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 ;-).
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 ;-)
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 ;-)
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 ;-)
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
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.
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.