1.2. fejezet, Delegate és Event

A delegate olyan típus, amely egy vagy több metódusra hivatkozik.

delegate int TestDelegate(int x);
 
static public int Pow(int x)
{
  return (x * x);
}
 
TestDelegate dlgt = Pow;
int result = dlgt(10);

Az event egy érték megváltozásakor hívódik meg:

    class EventTest
    {
        public delegate void EventHandlerDelegate(string message);
        public event EventHandlerDelegate TestStatusChange;
        public event EventHandlerDelegate BeforeStatusChange;
        private int data = 10;
        public int Data
        {
            get { return data; }
            set
            {
                this.OnBeforeChange();
                data = value;
                this.OnStatusChange();
            }
        }
 
        private void OnBeforeChange()
        {
            if (BeforeStatusChange != null)
            {
                BeforeStatusChange("régi érték:" + data);
            }
        }
 
        private void OnStatusChange()
        {
            if (TestStatusChange != null)
            {
                TestStatusChange("Az osztály állapota megváltozott! Új érték: "+data);
            }
        }
    }
        static public void Handler(string message)
        {
            Console.WriteLine(message);
        }
 
        static public void ProcessNew(string message)
        {
            Console.Out.WriteLine("Process message: {0}", message);
        }
 
        static public void BeforeChangeHandler(string message)
        {
            Console.Out.WriteLine(message);
        }
 
        static public void Events()
        {
            Console.WriteLine("=================== Events ===================");
            EventTest t = new EventTest();
            t.BeforeStatusChange += BeforeChangeHandler;
            t.TestStatusChange += Handler;
            t.TestStatusChange += ProcessNew;
            t.Data = 15;
        }

Az esemény tulajdonképpen egy speciális delegate. Három dologban különbözik attól:

  • Esemény lehet része interfésznek, míg delegate nem.
  • Egy eseményt csakis az az osztály „hívhatja” meg, amely deklarálta.
  • Egy esemény rendelkezik add és remove "metódusokkal", amelyek felülbírálhatóak.