'>

Passage de paramètres à une fonction en C sharp

Nous nous intéressons ici au mode de passage des paramètres d'une fonction. Considérons la fonction statique suivante :
1. private static void ChangeInt(int a) {
2. a = 30;
3. Console.WriteLine("Paramètre formel a=" + a);
4. }
Dans la définition de la fonction, ligne1, a est appelé un paramètre formel. Il n'est là que pour les besoins de la définition de la
fonction changeInt. Il aurait tout aussi bien pu s'appeler b. Considérons maintenant une utilisation de cette fonction :
1. public static void Main() {
2. int age = 20;
3. ChangeInt(age);
4. Console.WriteLine("Paramètre effectif age=" + age);
5. }
Ici dans l'instruction de la ligne 3, ChangeInt(age), age est le paramètre effectif qui va transmettre sa valeur au paramètre formel a.
Nous nous intéressons à la façon dont un paramètre formel récupère la valeur d'un paramètre effectif.
1.9.1 Passage par valeur
L'exemple suivant nous montre que les paramètres d'une fonction sont par défaut passés par valeur, c'est à dire que la valeur du
paramètre effectif est recopiée dans le paramètre formel correspondant. On a deux entités distinctes. Si la fonction modifie le
paramètre formel, le paramètre effectif n'est lui en rien modifié.
1. using System;
2.
3. namespace Chap1 {
4. class P12 {
5. public static void Main() {
6. int age = 20;
7. ChangeInt(age);
8. Console.WriteLine("Paramètre effectif age=" + age);
9. }
10. private static void ChangeInt(int a) {
11. a = 30;
12. Console.WriteLine("Paramètre formel a=" + a);
13. }
14. }
15.}
Les résultats obtenus sont les suivants :
1. Paramètre formel a=30
2. Paramètre effectif age=20
La valeur 20 du paramètre effectif age a été recopiée dans le paramètre formel a (ligne 10). Celui-ci a été ensuite modifié (ligne 11).
Le paramètre effectif est lui resté inchangé. Ce mode de passage convient aux paramètres d'entrée d'une fonction.
1.9.2 Passage par référence

Dans un passage par référence, le paramètre effectif et le paramètre formel sont une seule et même entité. Si la fonction modifie le
paramètre formel, le paramètre effectif est lui aussi modifié. En C#, ils doivent être tous deux précédés du mot clé ref :
Voici un exemple :
1. using System;
2.
3. namespace Chap1 {
4. class P12 {
5. public static void Main() {
6. // exemple 2
7. int age2 = 20;
8. ChangeInt2(ref age2);
9. Console.WriteLine("Paramètre effectif age2=" + age2);
10. }
11. private static void ChangeInt2(ref int a2) {
12. a2 = 30;
13. Console.WriteLine("Paramètre formel a2=" + a2);
14. }
15. }
16.}
et les résultats d'exécution :
1. Paramètre formel a2=30
2. Paramètre effectif age2=30
Le paramètre effectif a suivi la modification du paramètre formel. Ce mode de passage convient aux paramètres de sortie d'une
fonction.
1.9.3 Passage par référence avec le mot clé out
Considérons l'exemple précédent dans lequel la variable age2 ne serait pas initialisée avant l'appel à la fonction changeInt :
1. using System;
2.
3. namespace Chap1 {
4. class P12 {
5. public static void Main() {
6. // exemple 2
7. int age2;
8. ChangeInt2(ref age2);
9. Console.WriteLine("Paramètre effectif age2=" + age2);
10. }
11. private static void ChangeInt2(ref int a2) {
12. a2 = 30;
13. Console.WriteLine("Paramètre formel a2=" + a2);
14. }
15. }
16.}
Lorsqu'on compile ce programme, on a une erreur :
Use of unassigned local variable 'age2'
On peut contourner l'obstacle en affectant une valeur initiale à age2. On peut aussi remplacer le mot clé ref par le mot clé out. On
exprime alors que la paramètre est uniquement un paramètre de sortie et n'a donc pas besoin de valeur initiale :
1. using System;
2.
3. namespace Chap1 {
4. class P12 {
5. public static void Main() {
6. // exemple 3
7. int age3;
8. ChangeInt3(out age3);
9. Console.WriteLine("Paramètre effectif age3=" + age3);
10. }
11. private static void ChangeInt3(out int a3) {
12. a3 = 30;
13. Console.WriteLine("Paramètre formel a3=" + a3);
14. }
15. }
16.}
Les résultats de l'exécution sont les suivants :
1. Paramètre formel a3=30
2. Paramètre effectif age3=30

Publié par Drupal french Study