IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C#] Forcer une copie par référence d'un type primitif


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 31
    Par défaut [C#] Forcer une copie par référence d'un type primitif
    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 ?

  2. #2
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Peux-tu nous montrer le code que tu as tenté svp ?

  3. #3
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    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 
    }

  4. #4
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    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

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 31
    Par défaut
    Binoui, ça je sais bien, mais ce n'est pas ce que je veux C'est de ma faute, j'aurais du donner un exemple de code.

    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
    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é.

  6. #6
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    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

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 31
    Par défaut
    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#...

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 95
    Par défaut
    Citation Envoyé par kemenaran
    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 ?
    J'ai eu le même problème j'ai trouvé qu'une solution :

    Créer une classe contenant un Int :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Class RefInt
    {
       public int i;
    }
    A l'utilisation c'est aussi simple qu'un int. Parfois faut savoir aller au plus simple...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 31
    Par défaut
    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é :
    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"
    Ca ne fonctionne pas en l'état, mais semble être une piste intéressante.

  10. #10
    Membre expérimenté

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 95
    Par défaut
    Citation Envoyé par kemenaran
    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é :
    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"
    Ca ne fonctionne pas en l'état, mais semble être une piste intéressante.
    Hum...
    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...

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 31
    Par défaut
    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.

  12. #12
    Membre expérimenté

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 95
    Par défaut
    Citation Envoyé par kemenaran
    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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme inversion jour et mois lors d'une copie par macro
    Par alex830001 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/09/2008, 15h29
  2. passer une variable par référence
    Par roblescriso dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 04/04/2008, 17h05
  3. Réponses: 10
    Dernier message: 25/05/2007, 17h05
  4. [Tableaux] passage d'une variable par référence
    Par grinder59 dans le forum Langage
    Réponses: 7
    Dernier message: 14/05/2007, 17h52
  5. [Formulaire]forcer une valeur par défaut
    Par Dore dans le forum IHM
    Réponses: 2
    Dernier message: 03/04/2007, 13h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo