C#

Zdarzenia

Degusto

Do czego służą zdarzenia?

Zdarzenia służą do powiadomienia użytkownika, gdy w używanej klasie dojdzie do pewnych wydarzeń zdefiniowanych przez twórcę klasy.
Możemy dzięki temu w odpowiedni sposób reagować np. jeśli wartość zmiennej została zmieniona lub jeśli użytkownik kliknął w przycisk.

Jak stworzyć zdarzenie?

Zdarzenia tworzymy używając delegatów. Więcej informacji tutaj: Delegacje. Definicja zdarzenia wygląda tak:

public event TypDelegata NazwaZdarzenia;
 
public delegate void WartoscZmienionaEventHandler(int obecnaWartosc);
public event WartoscZmienionaEventHandler WartoscZmieniona;

Rejestrowanie własnych metod dla zdarzenia

Własne metody rejestrujemy identycznie jak w przypadku delegatów(możemy je też wyrejestrować).

var foo = new Foo();
 
foo.WartoscZmieniona += foo_WartoscZmieniona;

Możemy też zamiast metody zarejestrować po prostu delegata:

var foo = new Foo();
 
var delegat = new WartoscZmienionaEventHandler(foo_WartoscZmieniona);
 
foo.WartoscZmieniona += delegat;

Przykład

using System;
 
namespace Zdarzenia
{
    class Program
    {
        static void Main(string[] args)
        {
            var test = new TestFoo();
 
            test.Testuj();
 
            Console.ReadKey();
        }
    }
 
    class TestFoo
    {
        public void Testuj()
        {
            var foo = new Foo();
 
            foo.WartoscZmieniona += foo_WartoscZmieniona;
 
            foo.Wartosc = 5;
 
            foo.Wartosc = 6;
        }
 
        private void foo_WartoscZmieniona(int obecnaWartosc)
        {
            Console.WriteLine("Nowa wartość to: {0}", obecnaWartosc);
        }
    }
 
    delegate void WartoscZmienionaEventHandler(int obecnaWartosc);
 
    class Foo
    {
        public event WartoscZmienionaEventHandler WartoscZmieniona;
 
        private int _wartosc;
        public int Wartosc
        {
            get
            {
                return _wartosc;
            }
            set
            {
                _wartosc = value;
 
                if (WartoscZmieniona != null)
                {
                    WartoscZmieniona(_wartosc);
                }
            }
        }
    }
}
 

Delegaty vs Zdarzenia

Niektórym mogłoby się wydawać, że poza słówkiem event nie ma żadnej różnicy żadnej różnicy między delegatem, a zdarzeniem.
Jednak zdarzenia są pewnego rodzaju opakowaniem dla delegatów, tak jak właściwości dla pól. Dzięki temu zdarzenia mogą być częścią interfejsu.

Akcesory Add i Remove

Tak samo jak właściwości mają akcesory Get i Set tak samo zdarzenia mają Add i Remove. Powyższy przykład lekko zmodyfikowany:

using System;
 
namespace Zdarzenia
{
    class Program
    {
        static void Main(string[] args)
        {
            var test = new TestFoo();
 
            test.Testuj();
 
            Console.ReadKey();
        }
    }
 
    class TestFoo
    {
        public void Testuj()
        {
            var foo = new Foo();
 
            foo.WartoscZmieniona += foo_WartoscZmieniona;
 
            foo.Wartosc = 5;
 
            foo.Wartosc = 6;
        }
 
        private void foo_WartoscZmieniona(int obecnaWartosc)
        {
            Console.WriteLine("Nowa wartość to: {0}", obecnaWartosc);
        }
    }
 
    delegate void WartoscZmienionaEventHandler(int obecnaWartosc);
 
    class Foo
    {
        private event WartoscZmienionaEventHandler _wartoscZmieniona;
        public event WartoscZmienionaEventHandler WartoscZmieniona
        {
            add
            {
                if (value != null)
                {
                    _wartoscZmieniona += value;
                }
            }
            remove
            {
                if (value != null)
                {
                    _wartoscZmieniona -= value;
                }
            }
        }
 
        private int _wartosc;
        public int Wartosc
        {
            get
            {
                return _wartosc;
            }
            set
            {
                _wartosc = value;
 
                if (_wartoscZmieniona != null)
                {
                    _wartoscZmieniona(_wartosc);
                }
            }
        }
    }
}

Więcej informacji o delegatach i zdarzeniach

Rozdział 6
https://msdn.microsoft.com/en-us/library/aa645739(v=vs.71).aspx

C#

1 komentarz

Dla amatora przykłady ledwo czytelne... przydałyby się jakieś komentarze i łopatologia. Ale ogólnie może być