Comment les événements statiques se comparent-ils aux événements non statiques en C #?
Je viens de réaliser que les événements statiques existent - et je suis curieux de voir comment les gens les utilisent. Je me demande comment la comparaison tient jusqu'à la statique vs. méthodes d'instance. Par exemple, une méthode statique est fondamentalement une fonction globale. Mais j'ai toujours associé les événements avec des instances d'objets et j'ai du mal à penser à eux au niveau mondial.
Voici un peu de code pour vous y reporter si elle permet à une explication:
void Main()
{
var c1 = new C1();
c1.E1 += () => Console.WriteLine ("E1");
C1.E2 += () => Console.WriteLine ("E2");
c1.F1();
}
//<<delegate>>+D()
public delegate void D();
//+<<event>>E1
//+<<class>><<event>>E2
//+F()
// <<does>>
// <<fire>>E1
// <<fire>>E2
public class C1
{
public void F1()
{
OnE1();
OnE2();
}
public event D E1;
private void OnE1()
{
if(E1 != null)
{
E1();
}
}
static public event D E2;
static private void OnE2()
{
if(E2 != null)
{
E2();
}
}
}
source d'informationauteur Aaron Anodide
Vous devez vous connecter pour publier un commentaire.
Une grande partie de la programmation orientée objet peut être pensé en termes de transmission de message.
Un appel de méthode est un message de l'appelant à l'appelé (transportant les paramètres) et un message de retour avec la valeur de retour.
Un événement est un message de la source à l'abonné. Il y a donc potentiellement deux instances, celle de l'envoi du message et le destinataire.
Avec un événement statique, il n'y a pas d'envoi d'instance (juste un type, qui peut ou peut ne pas être une classe). Il peut encore être un bénéficiaire de l'instance codé en tant que cible de la déléguer.
Méfiez-vous des événements statiques. Rappelez-vous que, lorsqu'un objet s'abonne à un événement, une référence à cet objet est tenu par l'éditeur de l'événement. Cela signifie que vous devez être très prudent à propos explicitement désabonnement de la statique des événements qu'ils vont garder l'abonné vivant pour toujours, c'est à dire, vous pouvez vous retrouver avec l'équivalent géré d'une fuite de mémoire.
Dans le cas où vous n'êtes pas familier avec statique méthodes
Vous êtes probablement déjà familier avec les méthodes statiques. Dans le cas où vous ne l'êtes pas, facile-à-comprendre la différence, c'est que vous n'avez pas besoin de créer une instance d'un objet à toi d'utiliser une méthode statique, mais vous avez besoin de créer une instance d'un objet à appeler un non méthode statique.
Un bon exemple est le Système.IO.Annuaire et du Système.IO.DirectoryInfo classes.
Le Répertoire de la classe propose des méthodes statiques, tandis que la classe DirectoryInfo ne pas.
Il y a deux articles décrivant ici pour que vous voyez la différence par vous-même.
http://visualcsharptutorials.com/2011/01/system-io-directory-class/
http://visualcsharptutorials.com/2011/01/system-io-directoryinfo-class/
Maintenant statique événements...
Cependant, les événements statiques sont rarement observés dans la nature. Il y a très peu de cas que je peux penser opf où j'avais réellement envie de les utiliser, mais il est un CodeProject article qui ne montrent un potentiel d'utilisation.
http://www.codeproject.com/KB/cs/staticevent.aspx
La pensée clé ici est prise à partir de l'explication (caractères gras ajoutés par moi pour me montrer le texte):
Comme .NET développeurs nous sommes formés pour travailler avec un modèle déconnecté. Pensez ADO.NET comparé à d'ADO classique. DANS une application VB6, vous pouvez utiliser les contrôles de données qui permettrait de la fonctionnalité suivante: Si vous étiez l'exécution de l'application sur votre PC, les données de votre grille de la mise à jour lorsque quelqu'un sur un autre PC modifié les données.
Ce n'est pas quelque chose que .NET développeurs sont utilisés pour. Nous sommes très utilisé pour le modèle déconnecté. Événements statiques permettent une expérience plus "connectée". (même si l'expérience est quelque chose que nous ne sommes pas habitués.)
pour un aperçu de vérifier ce lien http://www.codeproject.com/KB/cs/staticevent.aspx
événement statique peut être utilisé
MAIS il faut les utiliser avec cuation... voir la discussion http://groups.google.com/group/microsoft.public.dotnet.languages.csharp/browse_thread/thread/2ac862f346b24a15/8420fbd9294ab12a%238420fbd9294ab12a?sa=X&oi=groupsr&start=1&num=2
plus d'infos
http://msdn.microsoft.com/en-us/library/8627sbea.aspx
http://dylanbeattie.blogspot.com/2008/05/firing-static-events-from-instance.html
http://www.nivisec.com/2008/09/static-events-dont-release.html
Membres statiques ne sont pas "global", ils sont tout simplement les membres de la classepas de des instances de classe. Cela est aussi vrai pour les événements comme pour les méthodes, propriétés, domaines, etc.
Je ne peux pas donner un exemple d'utilisation d'un événement statique, car en général je n'ai pas trouver de membres statiques pour être utile dans la plupart des cas. (Ils ont tendance à faire des allusions à des anti-modèles, comme Singleton.)