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 :

Méthode d'extension par référence impossible ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 10
    Par défaut Méthode d'extension par référence impossible ?
    Bonjour,

    J'utilise pas mal les méthodes d'extensions mais je viens de me rendre compte qu'on ne peut pas modifier la variable par référence.

    Par exemple on ne peut pas faire quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static void SetTest( ref this string str )
    {
        str = "new str";
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string test = "str";
    test.SetTest();
    System.Console.Write( test );
    //Output : new str
    On est apparemment obligé de faire ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static string SetTest( this string str )
    {
        return "new str";
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string test = "str";
    System.Console.Write( test.SetTest() );
    //Output : new str
    L’erreur est assez explicite :
    The parameter modifiers `this' and `ref' cannot be used together
    (http://msdn.microsoft.com/en-us/libr...(v=vs.90).aspx)

    Mais je me demande si il n'y pas moyen de contourner du manière ou d'une autre cette limitation ?

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Euh ben ca n'aurait pas trop de sens. Les méthodes d'extensions sont faites pour "rajouter du comportement" et simuler une méthode.
    Or il est quand même rare d'avoir une méthode d'un objet qui te modifie l'instance de l'objet (remplace l'ancienne instance). Soit une méthode agit sur l'objet en lui même, soit ca renvoie une autre instance mais ca remplace pas l'instance utilisée.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ça m'est arrivé 1 ou 2 fois de vouloir le faire, mais en général c'est pas très utile...
    Le problème est qu'en C# le passage de paramètre par référence se fait toujours explicitement (tu dois mettre le mot-clé ref au niveau de l'appel, et pas seulement au niveau de la déclaration), donc je vois pas trop comment une méthode d'extension avec un paramètre par référence pourrait s'utiliser.... S'il faut écrire un truc du genre (ref test).SetTest(), je vois pas trop l'intérêt d'une méthode d'extension, il vaut mieux l'utiliser comme une simple méthode statique.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    Or il est quand même rare d'avoir une méthode d'un objet qui te modifie l'instance de l'objet (remplace l'ancienne instance)
    Pourtant c'est tout à fait possible. Ce code compile et fait bien ce qu'il semble faire... du moins dans une certaine situation que je vous laisse deviner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        public void Replace(Test newValue)
        {
            this = newValue;
        }

  5. #5
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Mmmh... Intéressant comme comportement...
    J'avais pas pensé aux types valeurs! Bigre!

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Pourtant c'est tout à fait possible. Ce code compile et fait bien ce qu'il semble faire... du moins dans une certaine situation que je vous laisse deviner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        public void Replace(Test newValue)
        {
            this = newValue;
        }
    Euh il compile pas chez moi.
    T'es sur que t'as pas oublier un truc?

    EDIT:
    Erf ca marche mais uniquement avec des struct, c'est tricher les structs ^^

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par antoine.debyser Voir le message
    Euh il compile pas chez moi.
    T'es sur que t'as pas oublier un truc?

    EDIT:
    Erf ca marche mais uniquement avec des struct, c'est tricher les structs ^^
    Bah j'avais bien précisé que c'était seulement dans un certain cas

  8. #8
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Pourtant c'est tout à fait possible. Ce code compile et fait bien ce qu'il semble faire... du moins dans une certaine situation que je vous laisse deviner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        public void Replace(Test newValue)
        {
            this = newValue;
        }
    Bigre ! J'ignorais cela, je te remercie. C'est logique mais ça sent tellement le C++ que je n'aurais pas cru voir ça en C#.

  9. #9
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    C'est assez etrange quand même, quand on est dans une méthode d'une classe on pense finalement être dans l'instance de cette classe. Changer d'instance en cours de route est assez déroutant.

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    C'est assez etrange quand même, quand on est dans une méthode d'une classe on pense finalement être dans l'instance de cette classe. Changer d'instance en cours de route est assez déroutant.
    C'est pas vraiment que tu changes d'instance... les types valeur sont copiés par valeur, donc en fait cette instruction copie tout le "contenu" de newValue par dessus le contenu de this

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

Discussions similaires

  1. [PHP 5.4] Passage par référence dans un appel de méthode
    Par Feneck91 dans le forum Langage
    Réponses: 8
    Dernier message: 06/06/2014, 14h49
  2. Réponses: 4
    Dernier message: 12/12/2013, 20h01
  3. Réponses: 2
    Dernier message: 30/03/2009, 12h21
  4. Récupération de donnée par référence impossible
    Par Kahor5 dans le forum Windows Presentation Foundation
    Réponses: 9
    Dernier message: 19/01/2009, 13h38
  5. [JACOB] Comment passer un objet par référence à une méthode
    Par zlavock dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 21/03/2005, 18h28

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