poniedziałek, 10 grudnia 2018

Zdarzenia

Wcześniejsze notatki wprowadziły do zagadnienia delagarów oraz metod inline. Mając już wcześniej pozyskaną wiedzę, zastanówmy się w jaki sposób obsługiwać powiadomienia. Język C# udostępnia składową o nazwie zdarzenia, przeznaczoną do obsługi delegatów.

using System;

namespace HelloEvent
{
    public class Logger
    {
        public event Action Log;
    
        public void LogInfo(string message)
        {
            if(Log != null)
            {
                Log(message);
            }
        }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            var logger = new Logger();
            logger.Log += log => Console.WriteLine(log);

            logger.LogInfo("Start application");
            Console.ReadLine();
        }
    }
}

Kod powyżej przedstawia użycie zdarzenia korzystającego ze słowa kluczowgeo event poprzedzonego modyfikatorem dostępności. Dalej przekazany został typ delegatu, w tym przypadku jest to ActionList<string> oraz nazwa samego zdarzenia Log. Zadaniem klasy Logger jest przekazanie informacji o pojawiających się komunikatach. Dodanie do subskrypcji zdarzenia realizujemy poprzez +=, natomiast rezygnację -=. W przykładzie subskrypcję realizuje wyrażenie lambda. Metoda LogInfo odpowiada za propagację zdarzenia, zaczyna od sprawdzenia czy zdarzenie różni się od null, a następnie rozpoczyna propagację. Zabezpieczenie się przed null jest niezbędne. Próba uruchomienia zdarzenia, w sytuacji, gdy nie ma żadnych podpiętych delegatów spowoduje zgłoszenie wyjątku NullReferenceException. Patrząc na zdarzenie Log klasy Logger możemy mieć wrażenie, że jest to zwykłe pole udostępniająca delegat. W rzeczywistości tak nie jest. Z zewnątrz możliwe jest wyłącznie użycie operatorów += oraz -=, które tak naprawdę są ukrytymi metodami. Natomiast wewnątrz klasy dodatkowo możemy wywołać propagację zdarzenia.

Troska Robert