79 votes

L’utilisation des délégués en c#

Je suis nouveau ici et je suis aussi nouveau en langage c# et .NET framework. Pourriez-vous m’aider avec les délégués de compréhension ? J’ai essayé de vérifier un code et a constaté que les résultats que j’ai reçue étaient inattendues pour moi. Le voilà :

La réponse est 0, mais pas 10. Pourquoi ? Je vous remercie et je suis désolé pour mon mauvais anglais.

79voto

Daniel Hilgarth Points 90722

La raison en est la suivante:

La façon dont vous déclarez le délégué qu'il pointe directement vers l' ToString méthode de la static int instance. Il est capturé au moment de la création.

Comme flindeberg points dans les commentaires ci-dessous, chaque délégué a un objectif et une méthode pour être exécuté sur la cible.

Dans ce cas, la méthode à exécuter est évidemment l' ToString méthode. La partie intéressante est l'instance de l'exécution de la méthode: C'est l'instance d' I au moment de la création, ce qui signifie que le délégué n'est pas à l'aide de I pour obtenir l'instance à utiliser, mais il stocke la référence à l'instance elle-même.

Plus tard vous changez I à une valeur différente, fondamentalement affecter une nouvelle instance. Ce n'est pas comme par magie modifier l'instance saisi dans votre délégué, pourquoi devrait-il?

Pour obtenir le résultat que vous attendez, vous devrez modifier le délégué à ceci:

static Func<string> del = new Func<string>(() => I.ToString());

Comme cela, le délégué des points à une méthode anonyme qui s'exécute ToString sur le courant I au moment de l'exécution de la délégation.

Dans ce cas, la méthode à exécuter est une méthode anonyme créée dans la classe dans laquelle le délégué est déclarée. L'exemple est nul car c'est une méthode statique.

Regardez le code, le compilateur génère pour la deuxième version du délégué:

private static Func<string> del = new Func<string>(UserQuery.<.cctor>b__0);
private static string cctor>b__0()
{
    return UserQuery.I.ToString();
}

Comme vous pouvez le voir, c'est une méthode normale qui n' quelque chose. Dans notre cas, elle renvoie le résultat de l'appel d' ToString sur l'instance en cours d' I.

4voto

davenewza Points 4765

Vous devez passer en à votre fonction afin que peut être exécuté en temps voulu (au lieu d’au moment où fonction est créée).

1voto

Alex Filipovici Points 14194

Voici comment cela devrait être fait :

-2voto

Yshayy Points 129

Ma conjecture est qu’int sont passés par valeurs pas les références, et c’est pourquoi lors de la création du délégué, il est délégué à la méthode ToString de la valeur actuelle du « Je » (0).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X