4 votes

Pourquoi cet événement d'action est-il nul ?

J'ai actuellement 2 WinForms.

FormulaireA crée une instance de FormB . J'appelle le ShowDialog() méthode de FormB .

FormB définit public event Action<SomeClass, string> Analyze

Lorsque je clique sur le ProcessEvent bouton de FormB Je fais ce qui suit :

Action<SomeClass, string> tempAction = Analyze;
if (tempAction != null)
{
  tempAction.Invoke(instanceOfSomeClass, someString);
}

Mais l'événement n'est pas invoqué parce que tempAction est nulle.

Pourquoi serait-elle nulle ?

Je définis les événements de la même manière dans FormulaireA et ils fonctionnent bien.

EDITAR:

J'ai une classe de présentateur qui s'abonne à l'événement :

formBInstance.Analyze += StartAnalyze

8voto

Stecya Points 12073

Vous devez signer pour l'événement. S'il n'y a pas de souscripteurs, l'analyse sera nulle.

FormB form = new FormB();
form.Analyze += OnAnanlyze; // define callback function

2voto

jgauffin Points 51913

D'autres ont répondu à votre question initiale. Je vais simplement ajouter quelques points que vous devriez prendre en considération.

Initialisateur d'événement

Tout d'abord, vous pouvez utiliser `delegate {}' comme initialisateur pour tous les événements pour pouvoir sauter la vérification de nullité et aussi pour rendre vos événements thread safe.

Exemple :

public class MyClass
{
    public event EventHandler<TempActionArgs> TempAction = delegate {};
}

De cette façon, vous pouvez l'invoquer en utilisant simplement

TempAction(this, new TempActionArgs(someStrings);

Aucun contrôle n'est nécessaire.

Utilisation du mécanisme d'événement standard

N'utilisez pas Action<> pour les événements. Utilisez la norme EventHandler / EventArgs pour que votre application ressemble à n'importe quelle autre application NET. Action<> ne doit être utilisé que pour une invocation temporaire (et non pendant la durée de vie d'un objet). Les méthodes LINQ en sont un parfait exemple.

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