Bonjour,
Je voudrais qu'une variable int soit une référence à une autre, de type int également, mais je n'y arrive pas ; est-ce qu'il y a un moyen de forcer la copie d'un type primitif par référence en .NET ?
Bonjour,
Je voudrais qu'une variable int soit une référence à une autre, de type int également, mais je n'y arrive pas ; est-ce qu'il y a un moyen de forcer la copie d'un type primitif par référence en .NET ?
Salut .
il te suffit d'utiliser le mot clef ref dans la signature et l'appel de ta méthode .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 public void MaMethode(ref int x, ref int y) { x = y+2; y = x-4; } public void UneAutreMethode() { int x = 1; int y = 0; MaMethode(ref x, ref y); //x vaut 2 et y -2 }
arf dev01 tu m'as grillé, c'est dimanche et je voulais gentillement l'amener à cette conclusiontant pis tu as ta réponse kemenaran
![]()
Binoui, ça je sais bien, mais ce n'est pas ce que je veuxC'est de ma faute, j'aurais du donner un exemple de code.
Et moi je voudrais que x soit donc une copie par référence de y. Je sais que par défaut en C# les types primitifs et les structs sont copiées par valeur, et les classes par référence, mais est-ce qu'il y a un moyen de forcer la copie par référence pour les primitives ? Du coup le code précédent afficherait "1", ce qui serait le résultat demandé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 int x = 0; int y = 0; x = y; y = 1; Console.WriteLine(x); // Affiche "0", car y n'est pas copié par référence dans x
Mmmh je suppose qu'en déclarant Int32 à la place de int çà ne change rien ? il faudrait en effet que ce soit une classe pour que cela fonctionne dans ta façon de procéder
No, hélas, Int32 est une struct et pas un Objet, il est donc copié par valeur également.
On a pas droit à l'opérateur =& en C#, et pas le droit non plus au __box du C++ managé (qui ferait pourtant exactement ce que je cherche à réaliser). Je commence à me demander si c'est seulement possible en C#...
J'ai eu le même problème j'ai trouvé qu'une solution :Envoyé par kemenaran
Créer une classe contenant un Int :
A l'utilisation c'est aussi simple qu'un int. Parfois faut savoir aller au plus simple...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Class RefInt { public int i; }![]()
D'accord, un workaround quoi
Ok, merci beaucoup, je vais essayer avec ça.
Sinon, j'ai eu une piste expliquant que ceci devrait produire le résultat désiré :
Ca ne fonctionne pas en l'état, mais semble être une piste intéressante.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int value = 12; object o = value; // boxing de l'entier dans une boîte d'objet int value2 = (int)o; // unboxing dans value2 o = 42; Console.WriteLine(value2); // Devrait afficher "42", mais affiche hélas "12"
Hum...Envoyé par kemenaran
![]()
Je serais surpris qu'un boxing/unboxing puisse changer quelque chose. Lors du unboxing il y aura de toute façon une copie par valeur...
Oui, c'est ce que j'étais en train de me dire. Cela dit j'ai retrouvé la source de ce code, il provient d'un article de la MSDN traitant exactement de ce sujet, donc à priori sérieux.
je suppose que je n'ai pas encore compris toutes les finesses de cette article, mais je lirai plutôt ça à tête reposéeMerci !
EDIT: Oui, en fait c'est logique, si on utilise object tout le long du code et qu'on unbox seulement quand on a besoin de la valeur de la variable, ça devrait fonctionner.
Mouaip, pas trés lisible en tous casEnvoyé par kemenaran
. Je reste avec ma methode
!
Partager