// MailManager викликає цей метод для сповіщення об'єкту Fax про отримання нового поштового повідомлення private void PagerMsg(Object sender, NewMailEventArgs e) { // 'sender' використовується для взаємодії з об'єктом MailManager, якщо буде потрібно передати йому якусь інформацію. // 'e' визначає додаткову інформацію про подію, яку побажає надати MailManager. // Зазвичай розміщений тут код відправляє повідомлення по факсу. Тестова реалізація виводить інформацію на консоль. Console.WriteLine("Pagering mail message:"); Console.WriteLine(" From={0}, To={1}, Subject={2}", e.From, e.To, e.Subject); }
// Етап 4. Визначення методу, що перетворює вхідну інформацію в бажану подію public void SimulateNewMail(String from, String to, String subject) { Console.WriteLine("Отримано нове повідомлення! Сповіщую підписників..."); // Створити об'єкт для збереження інформації, яку потрібно передати отримувачам сповіщень NewMailEventArgs e = new NewMailEventArgs(from, to, subject); // Викликати віртуальний метод, який сповіщує об'єкт про подію // Якщо жоден з похідних типів не перевизначає цей метод, об'єкт сповістить всіх зареєстрованих одержувачів сповіщення OnNewMail(e); }
/* Тут NewMail - ім'я події, а його типом є EventHandler<NewMailEventArgs>. Це означає, що одержувачі * сповіщення про подію повинні надавати метод зворотнього виклику, прототип якого відповідний до типу- * делегату EventHandler<NewMailEventArgs>. Так як узагальнений делегат System.EventHandler визначений наступним чином: * public delegate void EventHandler<TEventArgs>(Object sender, TEventArgs e) where TEventArgs: EventArgs; * Тому прототип методу повинен виглядати ось так: * void MethodName(Object sender, NewMailEventArgs e); */ // Етап 3. Визначення методу відповідального за сповіщення зареєстрованих об'єктів про подію // УВАГА! Якщо цей клас ізольований (sealed), потрібно створити метод закритим і невіртуальним protected virtual void OnNewMail(NewMailEventArgs e) { // Зберегти посилання на делегат в тимчасовій змінній для забезпечення безпеки потоків EventHandler <NewMailEventArgs> temp = Volatile.Read(ref NewMail); // Якщо є об'єкти, які зареєстровані для отримання сповіщень про подію, сповіщуємо їх if (temp != null) { temp(this, e); } /* ПРИМІТКА. Visual Studio пропонує спростити 2 попередні рядки коду (використовуючи "синтаксичний цукор") таким чином: * Volatile.Read(ref NewMail)?.Invoke(this, e); */ }