Я пытаюсь лучше понять пример из документации Руководства по программированию в C #. Я наблюдал, как он выполняется пошагово в Visual Studio, и читал документацию для подсказок.
Используется общий делегат EventHandler. Вот код:
using System;
using System.Collections.Generic;
namespace DotNetEvents
{
class Program
{
class CustomEventArgs : EventArgs
{
public CustomEventArgs(string s)
{
message = s;
}
private string message;
public string Message
{
get { return message; }
set { message = value; }
}
}
class Publisher
{
public event EventHandler<CustomEventArgs> RaiseCustomEvent;
public void DoSomething()
{
Console.WriteLine("Did something");
}
protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
{
EventHandler<CustomEventArgs> handler = RaiseCustomEvent;
if(handler != null)
{
e.Message += $" at {DateTime.Now}";
handler(this, e);
}
}
}
class Subscriber
{
private string id;
public Subscriber(string ID, Publisher pub)
{
id = ID;
pub.RaiseCustomEvent += HandleCustomEvent;
}
void HandleCustomEvent(object sender, CustomEventArgs e)
{
Console.WriteLine(id + " received this message: {0}", e.Message);
}
}
static void Main(string[] args)
{
Publisher pub = new Publisher();
Subscriber sub1 = new Subscriber("sub1", pub);
Subscriber sub2 = new Subscriber("sub2", pub);
pub.DoSomething();
Console.ReadKey();
}
}
}
Почему следующая строка совершенно произвольна:
protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
{
EventHandler<CustomEventArgs> handler = RaiseCustomEvent;
if(handler != null)
{
e.Message += $" at {DateTime.Now}";
handler(this, e);
}
}
Ничто в этом методе не влияет на результат, если закомментировано. Кроме того, я закомментировал эти строки, и это, похоже, ни на что не влияло:
//pub.RaiseCustomEvent += HandleCustomEvent;
и
/* void HandleCustomEvent(object sender, CustomEventArgs e)
{
Console.WriteLine(id + " received this message: {0}", e.Message);
} */
Было бы очень полезно понять, почему этот материал добавлен. Спасибо. Для справки вот страница, с которой я получил код. Я удалил некоторые из его комментариев, поскольку печатал их, а не копировал и вставлял. https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/events/how-to-publish-events-that-conform-to-net-framework-guidelines