Sdílet prostřednictvím


Postupy: Publikování událostí odpovídajících směrnicím rozhraní .NET Framework (Průvodce programováním v C#)

Následující postup ukazuje, jak přidat události, které používají standardní .NET Framework vzorek do tříd a struktur.Všechny události v .NET Framework knihovna tříd, které jsou založeny na EventHandler delegovat, který je definován takto:

public delegate void EventHandler(object sender, EventArgs e);

[!POZNÁMKA]

.NET Framework 2,0 Zavádí obecnou verzi tohoto delegáta EventHandler.Následující příklady ukazují, jak používat obě verze.

Ačkoli ve třídách, které definujete události může být založen na jakýkoli typ delegáta platné i delegátů, které vrátí hodnotu, je obecně doporučeno, založit na události .NET Framework vzorku pomocí EventHandler, jak ukazuje následující příklad.

Události na základě vzorku vlastnost EventHandler pro publikování

  1. (Tento krok přeskočit a přejít na krok 3a, pokud nemáte vlastní data odeslat v události). Deklarace třídy pro vlastní data na obor, který je zobrazen na třídy vydavatele i odběratele.Potom přidejte požadované členy pro uložení dat vlastní události.V tomto příkladu je vrácen řetězec jednoduché.

    public class CustomEventArgs : EventArgs
    {
        public CustomEventArgs(string s)
        {
            msg = s;
        }
        private string msg;
        public string Message
        {
            get { return msg; }
        } 
    }
    
  2. (Tento krok přeskočit, pokud používáte obecný verzi EventHandler .) Deklarujte delegáta ve své třídě pro publikování.Zadejte jeho název, který končí vlastnost EventHandler.Druhý parametr určuje typ vašeho vlastního EventArgs.

    public delegate void CustomEventHandler(object sender, CustomEventArgs a);
    
  3. Deklarujte událost ve své třídě publikování pomocí následujících kroků.

    1. Máte-li žádné vlastní třídy EventArgs, bude váš typ události delegát vlastnost EventHandler Obecné.Není nutné deklarovat delegáta, protože je již deklarován System oboru názvů, který je součástí při vytváření projektu C#.Přidejte následující kód do třídy aplikace publisher.

      public event EventHandler RaiseCustomEvent;
      
    2. Pokud používáte verzi Obecné EventHandler a mají vlastní třídy odvozené od EventArgs, deklarovat události uvnitř třídy publikování a použít jako typ delegáta z kroku 2.

      public event CustomEventHandler RaiseCustomEvent;
      
    3. Pokud používáte verzi obecný, není nutné vlastního delegáta.Místo toho ve své třídě publikování zadáte jako událost typu EventHandler<CustomEventArgs>, nahrazující název vlastní třídy mezi lomenými závorkami.

      public event EventHandler<CustomEventArgs> RaiseCustomEvent;
      

Příklad

Následující příklad znázorňuje pomocí vlastní třídy EventArgs předchozí kroky a EventHandler jako typ události.

namespace DotNetEvents
{
    using System;
    using System.Collections.Generic;

    // Define a class to hold custom event info 
    public class CustomEventArgs : EventArgs
    {
        public CustomEventArgs(string s)
        {
            message = s;
        }
        private string message;

        public string Message
        {
            get { return message; }
            set { message = value; }
        }
    }

    // Class that publishes an event 
    class Publisher
    {

        // Declare the event using EventHandler<T> 
        public event EventHandler<CustomEventArgs> RaiseCustomEvent;

        public void DoSomething()
        {
            // Write some code that does something useful here 
            // then raise the event. You can also raise an event 
            // before you execute a block of code.
            OnRaiseCustomEvent(new CustomEventArgs("Did something"));

        }

        // Wrap event invocations inside a protected virtual method 
        // to allow derived classes to override the event invocation behavior 
        protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
        {
            // Make a temporary copy of the event to avoid possibility of 
            // a race condition if the last subscriber unsubscribes 
            // immediately after the null check and before the event is raised.
            EventHandler<CustomEventArgs> handler = RaiseCustomEvent;

            // Event will be null if there are no subscribers 
            if (handler != null)
            {
                // Format the string to send inside the CustomEventArgs parameter
                e.Message += String.Format(" at {0}", DateTime.Now.ToString());

                // Use the () operator to raise the event.
                handler(this, e);
            }
        }
    }

    //Class that subscribes to an event 
    class Subscriber
    {
        private string id;
        public Subscriber(string ID, Publisher pub)
        {
            id = ID;
            // Subscribe to the event using C# 2.0 syntax
            pub.RaiseCustomEvent += HandleCustomEvent;
        }

        // Define what actions to take when the event is raised. 
        void HandleCustomEvent(object sender, CustomEventArgs e)
        {
            Console.WriteLine(id + " received this message: {0}", e.Message);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Publisher pub = new Publisher();
            Subscriber sub1 = new Subscriber("sub1", pub);
            Subscriber sub2 = new Subscriber("sub2", pub);

            // Call the method that raises the event.
            pub.DoSomething();

            // Keep the console window open
            Console.WriteLine("Press Enter to close this window.");
            Console.ReadLine();

        }
    }
}

Viz také

Referenční dokumentace

Události (Průvodce programováním v C#)

Delegáti (Průvodce programováním v C#)

Delegate

Koncepty

Průvodce programováním v C#