Почему в этом примере EventHandler есть произвольный код из Руководства по программированию в C #? - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь лучше понять пример из документации Руководства по программированию в 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

1 Ответ

1 голос
/ 01 июля 2019

Когда вы вызываете pub.RaiseCustomEvent += HandleCustomEvent, этот код сам по себе ничего не делает, кроме как для регистрации метода в событии. Когда вы никогда не вызываете это событие, этот метод (мы называем его обработчиком событий), безусловно, никогда не будет выполнен.

В вашем коде вы вызываете это событие, вызывая OnRaiseCustomEvent где-то в вашем Publisher -классе. Однако мы не можем знать, когда это событие действительно должно быть возбуждено.

Например, вы можете вызывать событие всякий раз, когда какой-либо клиент вызывает DoSomething в любом Publisher экземпляре. Тогда вы бы позвонили OnRaiseCustomEvent из вашего DoSomething -метода:

public void DoSomething()
{
    OnRaiseCustomEvent(new CustomEventArgs("I did something"));
    Console.WriteLine("Did something");
}

Это когда вы вызываете pub.DoSomething событие вызывается и ваш обработчик события (HandleCustomEvent) будет вызван.

...