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 :

Passer une fonction en paramètre, sans delegate


Sujet :

C#

  1. #1
    Membre régulier Avatar de deejay2221
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 98
    Points : 78
    Points
    78
    Par défaut Passer une fonction en paramètre, sans delegate
    Bonjours

    Est-il possible de passer une fonction en paramètre mais à la façon ".NET"
    Comment ce fait-il que les fonctions de Microsoft puissent donner des fonctions du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThreadStart(void () target)
    Mais ça fait des heures que je cherche sur le net et nul part on trouve de solution pour passer des fonctions en paramètre aussi facilement (sans se déclarer de delegate void)?

    En résumé, je veux pouvoir passer une fonction en paramètre, pouvoir stocker le pointeur comme variable membre et appeler cette fonction quand je veux.

    Merci d'avance

  2. #2
    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
    Points : 39 753
    Points
    39 753
    Par défaut
    Il n'y a pas d'autre moyen que les delegate pour passer un fonction en paramètre... où est-ce que tu as vu la syntaxe que tu montres ? C'est ce qui apparait dans l'intellisense, non ? C'est juste une façon de présenter la signature de ThreadStart, ce n'est pas une "vraie" syntaxe. Ca indique juste que le constructeur de ThreadStart (qui est un delegate, au passage...) prend en paramètre une méthode void avec aucun paramètre

  3. #3
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Le mot-clé delegate n'est pas nécessaire. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // Méthode qui a la même signature que Predicate<int>
    public bool IsPair(int i) { return i % 2 == 0; } 
     
    List<int> GetPairs(List<int> source)
    {
     return source.FindAll(this.IsPair); // FindAll prend un Predicate<int> en paramètre
    // équivaut à
    return source.FindAll(new Predicate<int>(this.IsPair));
    }

  4. #4
    Membre régulier Avatar de deejay2221
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 98
    Points : 78
    Points
    78
    Par défaut
    Merci pour vos réponses.
    Donc entre autres mots, comment on fait pour passer un nom de fonction en paramètre? (avec ou sans paramètres)

    L'idée derrière tout ça est que j'encapsule le reste du code dans une DLL. Alors je dois pouvoir appeler une fonction très facilement (sans me créer de delegate avant de passer en paramètre). Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void FonctionA() 
    {
        // exécution de la fonction A
    }
     
    NameSpaceDLL.FonctionB(FonctionA);
    Si vous auriez un petit bout de code à me proposer ce serait très aprécié.
    (C'est le code du côté DLL qui m'intéresse le plus. Comment on fait pour créer une fonction qui reçoit une fonction)
    Merci beaucoup

  5. #5
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par deejay2221 Voir le message
    (C'est le code du côté DLL qui m'intéresse le plus. Comment on fait pour créer une fonction qui reçoit une fonction)
    Merci beaucoup
    Alors d'autant plus dans cette optique de DLL, vouloir faire ça sans delegates est un non-sens.

  6. #6
    Membre régulier Avatar de deejay2221
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 98
    Points : 78
    Points
    78
    Par défaut
    En fait je m'exprime peut-être mal.
    Oui je n'ai pas le choix de faire ça avec des delegate, puisqu'on parle ici de pointeur de fonction (qui sont des delegate en c# si j'ai bien compris).
    Ce que je veux dire, c'est que je ne veux pas créer de pointeur en dehors des DLL. Je veux seulement appeler une fonction en passant le nom d'une autre fonction en paramètre.

    Et ça peut importe ce qu'il y a dans la DLL (n'importe quelle façon ne me dérage pas à condition qu'on puisse envoyer une fonction de façon simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThreadStart ts = new ThreadStart(FonctionA); // Ça c'est simple !
    Merci encore

  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
    Points : 39 753
    Points
    39 753
    Par défaut
    Dans ton exemple (EDIT : celui du post #4... je suis en retard), si ta FonctionB prend en paramètre un delegate de la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public delegate void Action();
    Tu peux passer FonctionA directement en paramètre (comme tu l'as fait dans ton exemple), parce que FonctionA a bien la même signature que le delegate, donc la conversion se fait automatiquement.

  8. #8
    Membre régulier Avatar de deejay2221
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 98
    Points : 78
    Points
    78
    Par défaut
    AAhhhhh OK. Je viens de comprendre
    Alors tout ce que j'ai à faire c'est ceci :
    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
    19
    // Dans le programme
    private void FonctionA()
     
    MaDLL.FonctionB(FonctionA);
     
    // Dans la DLL
    public delegate void CallBackMethode();  // hors de la classe
     
    private CallBackMethode m_callBackExecution; // dans ma classe
     
    public void FonctionB(CallBackMethode p_callBackExecution)
    {
        m_callBackExecution = p_callBackExecution;
    }
     
    public void ExecuterFonctionExterne()
    {
        m_callBackExecution();
    }
    Merci à tout le monde

  9. #9
    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
    Points : 39 753
    Points
    39 753
    Par défaut
    C'est ça
    Juste 2 remarques :
    - Pas la peine de déclarer un delegate dans ce cas, il y en a déjà un dans le framework avec la même signature : Action
    - Avant d'invoker m_callBackExecution, tu devrais vérifier qu'il n'est pas null, sinon ça plante...

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

Discussions similaires

  1. Passer une fonction en paramètre
    Par jalane dans le forum C
    Réponses: 7
    Dernier message: 03/11/2012, 13h29
  2. Réponses: 16
    Dernier message: 26/05/2009, 13h32
  3. Réponses: 15
    Dernier message: 02/08/2007, 11h17
  4. Passer une fonction en paramètre ...
    Par Freeze dans le forum C++Builder
    Réponses: 2
    Dernier message: 14/10/2005, 16h51
  5. [Conception] Passer une fonction en paramètre
    Par pejay dans le forum Langage
    Réponses: 9
    Dernier message: 09/12/2004, 13h58

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