Outre le fait que C# est plus simpa (pour moi) que VB, surtout pour quelqu’un habitué a des languages comme java ou C++…
les mot clés byval et byref correspondent effectivement aux passage par valeur ou par référence, a savoir si la variable est copiée ou pas avant que la fonction soit éxecutée.
Par défaut, tout les appels sont par valeur, mais faut savoir, cependant, que lorsque la variable est un objet, on manipule en fait sa référence. Donc on passe une copie de la référence a l’objet.
Je sais, c’est compliqué, faudrait faire un exemple pour expliquer et tout…*
bon ok
[code]class TypeA
{
int b;
}
fonction( TypeA a, int b)
{
b+=2;
a.B = b;
}
…
TypeA objA = new TypeA();
objA.b = 4;
int i = 3;
fonction(objA , i);[/code]
Ici, les deux paramètres de fonction sont passés par valeur.
Cependant, l’objet passé en parametre n’est pas copié (sa référence l’est), du coup, en sortie de la fonction, l’objet référencé par objA est bien modifié. i reste inchangé.
[code]class TypeA
{
int b;
}
fonction( TypeA a, ref int b)
{
b+=2;
a.B = b;
}
…
TypeA objA = new TypeA();
objA.b = 4;
int i = 3;
fonction(objA , ref i);[/code]
Ici, on passe le deuxieme parametre (l’int) par reference. Résultat, en sortie de fonction i est modifié et vaut 5 (et non plus 3).
[code]class TypeA
{
int b;
}
fonction( TypeA a, int b)
{
b+=2;
a.B = b;
a = new TypeA();
a.B = 146;
}
…
TypeA objA = new TypeA();
objA.b = 4;
int i = 3;
fonction(objA , i);[/code]
Ici, le membre b de objA est égal à 9 en sortie. a = new TypeA(); change l’objet référencé par la variable a (sans détruire l’ancien ni changer l’objet référencé par objA).
[code]class TypeA
{
int b;
}
fonction( ref TypeA a, int b)
{
b+=2;
a.B = b;
a = new TypeA();
a.b = 146;
}
…
TypeA objA = new TypeA();
objA.b = 4;
int i = 3;
fonction(ref objA , i);[/code]
Ici, par contre, on passe objA par référence. Donc en sortie de fonction, l’objet référencé par objA est un objet tout neuf. (l’ancien étant voué a la destruction s’il n’est plus référencé nulle part).