Passage de paramètres

Signaler
Messages postés
1
Date d'inscription
dimanche 10 juin 2012
Statut
Membre
Dernière intervention
10 juin 2012
-
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
-
Bonjour à tous !

Alors voilà, j'ai un léger problème : étant habitué à passer des objets d'un formulaire à un autre, je ne faisais que ça. Mais finalement j'ai oublié comment faire avec des variables ! alors pour passer un Integer, je l'ai fait passer en référence avec ref et non out. Mais cela ne marche pas ...

FormNotes frm = new FormNotes(ref tabNotes, ref tabBaremes, ref nb);

est-ce la bonne solution ? merci d'avance !

2 réponses

Messages postés
15429
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
26 janvier 2021
503
Bonjour,

pout plus de lisibilité utilise les balises de codes, voir cet extrait de la signature de NHenry;
Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )



si tu veux passer une variable par référence, il faut le préciser à l'appel de la méthode ou formulaire, mais aussi à la déclaration de la méthode ou au constructeur du formulaire:

//constructeur du formulaire 2
public formSomme(ref int a, ref int b)
{
   somme(ref a, ref b);
}

//methode du formulaire 2

private int somme(ref int a, ref int b)
{
   return a+b;
}

//dans le formulaire 1
...
formSomme MaSomme = new formSomme(ref 1, ref 2);
....



si tu écris comme ça seules les valeurs seront passées:

//constructeur du formulaire 2
public formSomme(int a, int b)
{
   somme(a, b);
}

//methode du formulaire 2

private int somme(int a, int b)
{
   return a+b;
}

//dans le formulaire 1
...
formSomme MaSomme = new formSomme(1, 2);
....


Whismeril
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
Salut,

L'utilisation de ref peut être très utile dans certains cas, mais c'est généralement à éviter.
Pourquoi ? Je vois deux raisons :
- Même si le mot-clé ref doit être défini des deux côtés, on a une variable qui ressemble à n'importe quelle autre variable mais qui ne se comporte pas de la même façon (puisque ça change la valeur de la référence directement, et non de l'objet référencé). Et ça, c'est trompeur, et ça risque d'engendrer des erreurs.
- Si tu utilises ref avec un type par valeur (par exemple, int, double, DateTime, bool... ou n'importe quel type struct), tu vas faire du boxing. Le boxing correspond au fait d'"englober" ta variable par valeur dans un objet accessible par référence. Or, cette opération est très coûteuse.

Voici trois solutions pour résoudre ton problème sans ref :
- Envoyer "this" à la place de tes paramètres, et tu modifies directement les variables dans le form appelant.
- Mettre ces trois variables dans une classe, et envoyer l'objet correspondant (ce qui revient au même que la première solution, mais en n'ayant accès qu'à ces trois variables).
- Envoyer tes variables normalement, sans ref, garder la référence vers FormNotes, et accéder aux valeurs depuis FormNotes dans ton form appelant.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -