Bonjour est-il possible d'avoir une explication simplifiée de ce concept de valeur et de référence car je n'arrive pas à totalement le saisir.
D'avance merci.
Bonjour est-il possible d'avoir une explication simplifiée de ce concept de valeur et de référence car je n'arrive pas à totalement le saisir.
D'avance merci.
Je viens de trouver une bonne explication sur un autre site :
.NET distingue deux types de données différentes :
- les types valeurs (int, float, doube, struct, etc.) stockés sur la pile et passés en paramètres par copie
- les types références (object, string, class, etc.) stockés sur le tas managé et passés obligatoirement en paramètre, par référence
Pour forcer un type valeur à être passer en référence et pouvoir donc le modifier depuis une autre méthode, vous pouvez utiliser les mots clés ref ou out.
out et ref fonctionnent de la même manière, excepté que out permet de passer par référence un paramètre non initialisé
Vu le nombre d'articles techniques sur Internet sur ce sujet, je vais essayer une nouvelle méthode pédagogique pour expliquer le passage par référence et par valeur :
Si je te dis que je gagne 2 500 euros. Tu peux me retourner "ouai il gagne pas trop mal sa vie". Ça, c'est du passage par valeur !
Si maintenant je te donne en billets tout mon salaire de 2 500 euros. Que tu claques la moitié, et que tu me rendes 1 250 euros. Bon j'ai perdu un peu de tunes, il y a eu un peu d'effet de bord et de casse, car c’est du passage par référence !
Heureusement que par défaut, on passe les entiers en valeur, car à force je perdrai pas mal d'argent avec toi !
Le String de ta copine est un bel Objet, il n'est pas primitif mais se comporte comme tel; en effet le sacré vicelard qui a écrit la Framework, l'a rendu immuable (=pas modifiable), pour que le passage du String se fasse par copie! Du coup ta copine est sûr de ne jamais le perdre, ni même qu'il ne rétrécisse en le passant à la machine !
EDIT:
Merci tomlev pour la correction
merci les amis pour vos réponses et spécialement alavoler pour le type de réponse que je recherchais précisément!
même si je n'ai pas totalement saisir l'exemple
mais je pense que le simple est:
le passage par valeur : on passe la valeur, pas l'objet lui même, ce qui fait s' il y'a un changement dans la valeur. l'objet gardera ça valeur initiale.
le passage par référence :on passe l'objet lui même et ,si bien sûr, il a changé ça valeur changera.
un exemple ça sera plus parlant
si on fait :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 void Updatebyval(string valeur) { valeur="azstar;Version par valeur"; } void Updatebyref(ref string valeur) { valeur="azstar;version par ref "; }
j’espère que c'est clair
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 //par valeur string value="Walo"; Updatebyval(value); //ICI la valeur de value restera toujours "Walo" Updatebyref(ref value); //ICI la valeur changera et sera "azstar;version par ref "
Si tu aimes ma Réponse pense à cliquer sur
Visiter mon blogEt mes codes sources
- La simulation de navigation dans internet explorer avec Interop.SHDocVw
- Protéger mes données de configuration dans une dll compilée
D'après ce que j'ai compris les types valeurs c'est leur valeurs stockées tel quel en mémoire avec lequel tu travail, alors que les types par référence c'est un pointeur vers l'objet en mémoire.
Donc quand tu copie un type valeur c'est cette valeur que tu copie à un autre emplacement mémoire, alors que pour le type par référence c'est le pointeur que tu copie résultat ce pointeur pointe toujours au même endroit.
PS: le string à un fonctionnement assez particulier.
bonjour ezrider
Attention au Passage par defaut (sans specification precise dans l'Appelant le Caller):
- les types valeus sont passes par Valeur...
- les types references sont passes Reference...
doc MSDN rubrique
Passage par référence et Passage par valeur:
Sur un plan pratique et terre à terre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Par défaut, lorsqu'un type valeur est passé à une méthode, une copie est passée plutôt que l'objet lui-même.Par conséquent, les modifications apportées à l'argument n'ont aucun effet sur la copie d'origine dans la méthode d'appel.....(plus loin).... Les types référence sont passés par référence. Lorsqu'un objet d'un type référence est passé à une méthode, la référence pointe vers l'objet d'origine, et non vers une copie.Les modifications apportées par le biais de cette référence seront par conséquent répercutées dans la méthode d'appel
- si tu veux passer un type Valeur (entier,double,boolean ) par Reference utilise la double specification [IN,OUT] ...car c'est un type valeur....
- inversement si tu veux passer un type Reference (class,array ) par Valeur utilise la specification [IN] ...car c'est un type Reference....
bon code.............
Partager