2009-09-25 10 views
13

À quoi servent les événements protégés ou privés (non statiques) dans .NET?Quels cas d'utilisation existent pour les événements privés ou protégés non statiques?

Il semble que tout événement privé ou protégé soit plus facilement géré via une méthode virtuelle. Je peux (un peu) voir la nécessité de cela dans les événements statiques, mais pas pour les événements normaux.

Avez-vous déjà eu un cas d'utilisation qui démontre clairement un besoin ou un avantage pour un événement privé ou non protégé?

+0

Intéressé à voir les réponses moi-même. Faites votre cas! –

Répondre

6

Il me semble qu'un bon exemple d'endroit où un événement privé est utile est dans la construction de composant/contrôle, souvent vous pouvez avoir un composant qui est composé d'un ou plusieurs autres composants, les événements privés qui contiennent des composants peuvent s'abonner est une implémentation pratique et facile d'un modèle d'observateur.

Edit:

Laissez-moi vous donner un exemple ...

Supposons que vous écrivez un contrôle de type grille, et à l'intérieur de ce contrôle vous auriez très probablement un tas de classes contenus qui sont créés dynamiquement Des lignes, des colonnes, des en-têtes, etc. indiquent par exemple que vous souhaitez signaler à ces classes contenues que quelque chose leur importe, par exemple une modification Skinning ou quelque chose comme ça, quelque chose que vous ne voulez pas exposer comme un événement. utilisateurs, c'est là que les événements privés sont à portée de main, ont simplement un ou deux gestionnaires et que vous créez chaque instance de votre ligne ou col ou quoi que ce soit attacher le gestionnaire, sinon vous avez juste à vous écrire r propre mécanisme d'observateur, pas difficile, mais pourquoi quand vous n'avez pas à et vous pouvez simplement utiliser des événements de multidiffusion.

+0

Pour que le composant fonctionne, les éléments individuels n'auraient-ils pas besoin d'avoir des événements publics (ou au moins internes)? Comment le «composant composite» va-t-il s'abonner à un événement privé ou protégé sur sa/ses partie (s)? –

+0

Les classes contenues sont justes, contenues, donc elles sont dans la portée de la classe définissant l'événement privé. –

+0

Oh, vous pensez spécifiquement à un composant défini comme une classe imbriquée, alors? –

7

Voici un scénario un peu bizarre mais réel que j'ai implémenté une fois. Vous avez des moitiés générées par l'utilisateur et générées par l'utilisateur d'une classe partielle. La moitié générée par la machine contient du code qui souhaite informer la moitié générée par l'utilisateur lorsqu'un événement se produit. Mais la moitié générée par l'utilisateur ne se soucie peut-être pas de faire quoi que ce soit, ou elle pourrait en faire assez. Il semble grossier de la moitié générée par la machine d'exiger que la moitié générée par l'utilisateur de mettre en œuvre une méthode particulière afin de gérer un message qu'ils n'ont aucun intérêt à écouter.

Pour résoudre ce problème, la moitié générée par la machine pouvait tirer sur un événement privé. Si la moitié générée par l'utilisateur se soucie, il peut s'abonner à l'événement. Sinon, il peut l'ignorer.

Ce scénario est maintenant traité plus élégamment par des méthodes partielles dans C# 3, mais ce n'était pas une option à l'époque.

+0

Très intéressant, même si je suis d'accord méthodes partielles sont probablement une option plus intéressante dans la plate-forme actuelle. –

+0

Incidemment, lorsque nous avons conçu cette architecture pour la première fois, VB ne prenait pas réellement en charge l'écoute de vos propres événements. Je crois que c'est le cas maintenant. –

1

Les types imbriqués ont accès aux événements privés et protégés du type englobant. J'ai utilisé cette fonctionnalité pour notifier les contrôles enfants (le type imbriqué) des changements d'état dans le contrôle parent (le type englobant) dans une application Silverlight.

0

Désolé pour faire glisser un vieux fil, mais j'utiliser des événements privés en toute impunité dans l'un de mes projets, et personnellement, je trouve qu'il est un bon moyen de résoudre un problème de conception:

Voici le code abrégé:

public class MyClass 
{ 
    private event EventHandler _myEvent; 

    public ExternalObject { get; set; } 

    public event EventHandler MyEvent 
    { 
    add 
    { 
     if (_myEvent.GetInvocationList().Length == 0 && value != null) 
     ExternalObject.ExternalEvent += HandleEvent; 
     _myEvent+= value; 
    } 
    remove 
    { 
     _myEvent-= value; 
     if (_myEvent.GetInvocationList().Length == 0) 
     ExternalObject.ExternalEvent -= HandleEvent; 
    } 
    } 

    private void HandleEvent(object sender, EventArgs e) 
    { 
    _myEvent.Raise(this, EventArgs.Empty); // raises the event. 
    } 
} 

Fondamentalement, MyEvent n'est jamais soulevé dans le gestionnaire d'événements de ExternalObject.ExternalEvent, donc s'il n'y a pas des gestionnaires pour MyEvent alors je ne pas besoin d'attacher un gestionnaire à l'événement externe, accélérant légèrement le code en enregistrant une empiler le cadre.

0

Non seulement l'instance actuelle peut accéder à un membre privé. D'autres instances du même type peuvent aussi!Cela permet certains scénarios où ce contrôle d'accès peut être utile.

Je pense à une structure arborescente dans laquelle tous les nœuds héritent d'un certain type et un événement privé/protégé permet de propager des événements de feuilles à leurs parents. Comme ils sont du même type, le parent peut s'inscrire à l'événement privé de l'enfant. Pourtant, tout client de la structure arborescente ne peut pas.

Je peux certainement voir un cas d'utilisation dans un répertoire comme le système de stockage où chaque répertoire doit propager sa dernière date de modification à son parent par exemple.

Questions connexes