Programowanie w języku C#

Zdarzenia


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

1 komentarz

ArtystaCS_ 2015-09-09 01:12

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