OVH Cloud OVH Cloud

Passage par référence Explicite

6 réponses
Avatar
SM
Bonjour,

Puisque les parameteres sont passés par référence, pourquoi dans certains
exemples (dans MSDN par exemple) le mot ref est ajouté devant la declaration
du parametre

Exemple : MyFunction (ref ComboBox cbList) {....}

Merci

6 réponses

Avatar
RAVAILLE James
Bonjour,

Je ne suis pas d'accord avec vous. En C# tous les paramètres sont passés par
défaut par valeur. Lorsque le paramètre est un objet, c'est en fait la
référence de l'objet qui est passée par valeur.

Le mot clé ref permet à dans une méthode appelante, de récupérer la valeur
d'un paramètre modifiée au sein d'une méthode.

Voici un exemple très simple :
- Soit la méthode suivante
private void Tester(string sChaine)
{
sChaine = "titi";
}
Alors dans une appelant cette méthode :
sChaineTest = "toto";
this.Tester(sChaineTest);
? sChaineTest ==> toto

- Alors qu'avec la méthode suivante :
private void Tester(ref string sChaine)
{
sChaine = "titi";
}
Alors dans une appelant cette méthode :
sChaineTest = "toto";
this.Tester(ref sChaineTest);
? sChaineTest ==> titi

Pour information :
Il existe une autre mode de passage des paramètre : le passage par résultat
avec le mot clé out (=paramètre-résultat).


Cordialement,

--
James RAVAILLE.
MCAD .NET et MCT .NET
http://www.certifdotnet.com


"SM" a écrit :

Bonjour,

Puisque les parameteres sont passés par référence, pourquoi dans certains
exemples (dans MSDN par exemple) le mot ref est ajouté devant la declaration
du parametre

Exemple : MyFunction (ref ComboBox cbList) {....}

Merci






Avatar
SM
> Lorsque le paramètre est un objet, c'est en fait la
référence de l'objet qui est passée par valeur.



Exactement c'est ici ma question, puisque les OBJETS sont passés par
référence, pourquoi dans beaucoups des exemples certains auteurs ajoutent le
mot clé ref (je comprend lutilité de ref devant un string ou un integer mais
non devant un OBJET tel un ComboBox, StringBuilder...)

Pouvez vous SVP me dire l'utilité de "ref" dans cet exemple que j'ai pris
par hazard d'un site respecté ?

public static void InitFontCombo(ref ComboBox comboBox)
{
foreach(FontFamily fFonts in System.Drawing.FontFamily.Families)
comboBox.Items.Add(fFonts.Name);
}

Merci
Avatar
Jean-Pierre Thomasset
SM wrote:
Lorsque le paramètre est un objet, c'est en fait la
référence de l'objet qui est passée par valeur.




Exactement c'est ici ma question, puisque les OBJETS sont passés par
référence, pourquoi dans beaucoups des exemples certains auteurs ajoutent le
mot clé ref (je comprend lutilité de ref devant un string ou un integer mais
non devant un OBJET tel un ComboBox, StringBuilder...)



Bonjour,

En fait, comme James l'indique, les references des objets sont passés
par valeur (par défaut) : ce que cela veut dire c'est que l'on peut
travailler avec l'instance de l'objet et que toute utilisation de
méthode de cette instance est persistante, par contre, on ne peux pas
reinstancié l'objet et esperer que cette nouvelle instance soit conservé
au retour de la fonction.

L'exemple précedent avec la classe string est un peu ambigue car quand
on écrit
sChaine = "titi";
cela est traduit par
sChaine = new string("titi");

Ce qui crée une nouvelle instance !
Si on prend l'exemple suivant :

void Test1(string sChaine)
{
sChaine.Trim();
}

void Test2(string sChaine)
{
sChaine = new string("Hello !");
// equivalent à : sChaine="Hello !";
}

void Test3(ref string sChaine)
{
sChaine = new string("Hello Test 3!");
}


Et en appelant ces methodes comme ceci :

sTest = " ceci est un test ";

Test1(sTest);
// Maintenant sTest vaut "ceci est un test", on a supprimer les espaces

Test2(sTest);
// sTest vaut toujours "ceci est un test",
// car on a passé la réference par valeur

Test3(ref sTest);
// maintenant sTest vaut "Hello Test 3!"
// car on a passé la référence par REFERENCE !!!

Ce n'est pas forcément évident au premire abord, mais j'espere que ces
exemples vous aideront !

Cordialement,

JP.
Avatar
Simon Mourier [SoftFluent]
A priori, dans cette méthode, ou plus précisément cette implémentation, le
ref ne sert strictement à rien puisque comboBox n'est pas modifié.

Il y a un cas ou cela pourrait être utile, si par exemple, on voulait avoir
une signature de méthode commune à plusieurs classes, avec une
implémentation variable.
Exemple:

class C1
{
public static void InitFontCombo(ref ComboBox comboBox)
{
foreach(FontFamily fFonts in System.Drawing.FontFamily.Families)
comboBox.Items.Add(fFonts.Name);
}
}

class C2
{
public static void InitFontCombo(ref ComboBox comboBox)
{
comboBox = new ComboBox(blabla...);
blabla...
}
}

Avec l'utilisation des classes d'introspection (System.Reflexion) on est
capable d'utiliser C1 ou C2 de manière dynamique. Bon. Le pattern est un peu
tordu, et il vaut mieux utiliser des interfaces ou classes de base pour
cela, mais on le rencontre parfois y compris dans le .NET Framework
lui-même.

Simon.
www.softfluent.com


"SM" a écrit dans le message de news:
Og4xzq3%
Lorsque le paramètre est un objet, c'est en fait la
référence de l'objet qui est passée par valeur.



Exactement c'est ici ma question, puisque les OBJETS sont passés par
référence, pourquoi dans beaucoups des exemples certains auteurs ajoutent
le
mot clé ref (je comprend lutilité de ref devant un string ou un integer
mais
non devant un OBJET tel un ComboBox, StringBuilder...)

Pouvez vous SVP me dire l'utilité de "ref" dans cet exemple que j'ai pris
par hazard d'un site respecté ?

public static void InitFontCombo(ref ComboBox comboBox)
{
foreach(FontFamily fFonts in System.Drawing.FontFamily.Families)
comboBox.Items.Add(fFonts.Name);
}

Merci




Avatar
Ambassadeur Kosh
> Pouvez vous SVP me dire l'utilité de "ref" dans cet exemple que j'ai pris
par hazard d'un site respecté ?

public static void InitFontCombo(ref ComboBox comboBox)
{
foreach(FontFamily fFonts in System.Drawing.FontFamily.Families)
comboBox.Items.Add(fFonts.Name);
}



ben la, aucune. par contre, la...

public static void InitFontCombo(ref ComboBox comboBox)
{
comboBox = new ComboBox() ;

foreach(FontFamily fFonts in System.Drawing.FontFamily.Families)
comboBox.Items.Add(fFonts.Name);
}
Avatar
RAVAILLE James
La réponse a été donnée...

Cordialement,

--
James RAVAILLE.
MCAD .NET et MCT .NET
http://www.certifdotnet.com


"SM" a écrit :

> Lorsque le paramètre est un objet, c'est en fait la
> référence de l'objet qui est passée par valeur.

Exactement c'est ici ma question, puisque les OBJETS sont passés par
référence, pourquoi dans beaucoups des exemples certains auteurs ajoutent le
mot clé ref (je comprend lutilité de ref devant un string ou un integer mais
non devant un OBJET tel un ComboBox, StringBuilder...)

Pouvez vous SVP me dire l'utilité de "ref" dans cet exemple que j'ai pris
par hazard d'un site respecté ?

public static void InitFontCombo(ref ComboBox comboBox)
{
foreach(FontFamily fFonts in System.Drawing.FontFamily.Families)
comboBox.Items.Add(fFonts.Name);
}

Merci