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 ?
Version imprimable
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 ?
Peux-tu nous montrer le code que tu as tenté svp ?
Salut .
il te suffit d'utiliser le mot clef ref dans la signature et l'appel de ta méthode .
Code:
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 conclusion :( tant pis tu as ta réponse kemenaran :)
Binoui, ça je sais bien, mais ce n'est pas ce que je veux :roll: C'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:
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 :Citation:
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:
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:
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... :koi:Citation:
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ée :) Merci !
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 cas :? . Je reste avec ma methode ;) !Citation:
Envoyé par kemenaran