OVH Cloud OVH Cloud

passage de parametres et mot clef ref

3 réponses
Avatar
cyrille
salut,

comme je switch souvent de langage, des fois je me pose des questions=20
existencielles...

C# utilise le passage de param=E8tres par valeur et il faut explicitement=
=20
sp=E9cifier l'un des mots clef 'ref' ou 'out' pour un passage de param=E8tr=
es par=20
r=E9f=E9rence.

Du coup, quand on prom=E8ne un noeud xml ou un tableau ou une grosse cha=EE=
ne =E0=20
travers plusieures m=E9thodes, pour optimiser la vitesse et la m=E9moire il=
faut=20
utiliser le passage de param=E8tre par r=E9f=E9rence donc le mot clef 'ref'=
. Ca =E9vite=20
qu'une copie de l'objet soit r=E9alis=E9e =E0 chaque empilement.

est-ce que j'ais bon ?

Si oui, comment fait C# pour copier un objet si celui-ci ne poss=E8de pas d=
e=20
m=E9thode Clone() ? Et souvent s'il la poss=E8de, elle effectue une copie=
=20
partielle.

Comme vous le voyez, je suis un peu embrouill=E9 ;-)
Merci donc pour vos lumi=E8res rafra=EEchissantes !

cyrille

3 réponses

Avatar
Ambassadeur Kosh
> est-ce que j'ais bon ?



ben non, puisque qu'un XmlNode est une class, et qu'un Array aussi

Si oui, comment fait C# pour copier un objet si celui-ci ne possède pas de
méthode Clone() ? Et souvent s'il la possède, elle effectue une copie
partielle



un cas concret, la comme ça, c'est pas hyper clair.
Avatar
Zazar
Bonsoir,

C# utilise le passage de paramètres par valeur et il faut explicitement
spécifier l'un des mots clef 'ref' ou 'out' pour un passage de paramètres


par
référence.

Du coup, quand on promène un noeud xml ou un tableau ou une grosse chaîne


à
travers plusieures méthodes, pour optimiser la vitesse et la mémoire il


faut
utiliser le passage de paramètre par référence donc le mot clef 'ref'. Ca


évite
qu'une copie de l'objet soit réalisée à chaque empilement.

est-ce que j'ais bon ?


Oui et non. En .NET, il y a deux types d'objets : les objets de type valeurs
et les objets de type référence.
Les premiers contiennent par exemple le type int, les structures, ... ; les
deuxièmes : les string, ou les XmlNodes.
Dans le cas d'un passage par valeur d'un type référence, c'est la valeur de
la référence que vous passez, pas l'objet lui-même. Il n'y a donc pas de
copie et vous pouvez passer par valeur des chaînes aussi grosses que vous le
désirer.
Dans le cas d'un passage par valeur d'un type valeur, l'objet est
effectivement copié.

Si oui, comment fait C# pour copier un objet si celui-ci ne possède pas de
méthode Clone() ? Et souvent s'il la possède, elle effectue une copie
partielle.


Dans le cas d'un passage par valeur d'un type valeur, c'est une copie
partielle qui est faîte Pour les types numériques ou les enumérations, ça ne
pose aucun problème. Pour les structures, effectivement si un des membres
est de type référence alors il n'est pas cloné. Effectivement en théorie il
doit y avoir des cas où ça peut poser probléme, mais dans la pratique ça
doit pas arriver tous les jours.
Sinon, ce n'est pas parce qu'un objet ne possède pas de méthode Clone que le
clr ne saurait pas le cloner. Il n'est pas obligé de se limiter à appeler
les méthodes fournies par l'objet, il a toutes les informations qu'il lui
faut pour le faire.

--
Zazar
Avatar
Mitsuru FURUTA [Ms]
Tout à fait,

Le seul intérêt à passer un objet de type référence avec le mot clé "ref"
est de modifier la référence elle-même en voulant que l'appelant soit
également modifié.

Mitsuru FURUTA [Microsoft FRANCE]

"Zazar" wrote in message
news:eT#WoT#
Bonsoir,

> C# utilise le passage de paramètres par valeur et il faut explicitement
> spécifier l'un des mots clef 'ref' ou 'out' pour un passage de


paramètres
par
> référence.
>
> Du coup, quand on promène un noeud xml ou un tableau ou une grosse


chaîne
à
> travers plusieures méthodes, pour optimiser la vitesse et la mémoire il
faut
> utiliser le passage de paramètre par référence donc le mot clef 'ref'.


Ca
évite
> qu'une copie de l'objet soit réalisée à chaque empilement.
>
> est-ce que j'ais bon ?
Oui et non. En .NET, il y a deux types d'objets : les objets de type


valeurs
et les objets de type référence.
Les premiers contiennent par exemple le type int, les structures, ... ;


les
deuxièmes : les string, ou les XmlNodes.
Dans le cas d'un passage par valeur d'un type référence, c'est la valeur


de
la référence que vous passez, pas l'objet lui-même. Il n'y a donc pas de
copie et vous pouvez passer par valeur des chaînes aussi grosses que vous


le
désirer.
Dans le cas d'un passage par valeur d'un type valeur, l'objet est
effectivement copié.

> Si oui, comment fait C# pour copier un objet si celui-ci ne possède pas


de
> méthode Clone() ? Et souvent s'il la possède, elle effectue une copie
> partielle.
Dans le cas d'un passage par valeur d'un type valeur, c'est une copie
partielle qui est faîte Pour les types numériques ou les enumérations, ça


ne
pose aucun problème. Pour les structures, effectivement si un des membres
est de type référence alors il n'est pas cloné. Effectivement en théorie


il
doit y avoir des cas où ça peut poser probléme, mais dans la pratique ça
doit pas arriver tous les jours.
Sinon, ce n'est pas parce qu'un objet ne possède pas de méthode Clone que


le
clr ne saurait pas le cloner. Il n'est pas obligé de se limiter à appeler
les méthodes fournies par l'objet, il a toutes les informations qu'il lui
faut pour le faire.

--
Zazar