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.