Какая структура лучше, передавая обработчик события как аргумент или слушая срабатывание события? - PullRequest
0 голосов
/ 30 января 2019

Меня интересует подходящая структура класса, касающаяся использования обработчика событий.

У меня есть класс Age, который вызывает действие при изменении значения age.У меня есть класс Person, в котором переменная-член имеет объект Age.

В моем первом сценарии класс Person передает свой обработчик событий объекту Age в качестве аргумента своего конструктора.

class Age
{
    private readonly EventHandler _valueChanged;

    private int _value;

    public int Value
    {
        get { return _value; }
        private set
        {
            _value = value;
            RaiseValueChangedEvent();
        }
    }

    public Age(EventHandler handler)
    {
        _valueChanged = handler;
    }

    protected void RaiseValueChangedEvent()
    {
        var handler = _valueChanged;
        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
    }
}

class Person
{
    private readonly Age _age;

    public Person()
    {
        _age = new Age(OnAgeChanged);
    }

    protected void OnAgeChanged(object sender, EventArgs e)
    {
        // Do what is necessary.
    }
}

Во втором сценарии у класса Age есть событие, а класс Person прослушивает его запуск.

class Age
{
    public event EventHandler ValueChanged;

    private int _value;

    public int Value
    {
        get { return _value; }
        private set
        {
            _value = value;
            RaiseValueChangedEvent();
        }
    }

    protected void RaiseValueChangedEvent()
    {
        var handler = ValueChanged;
        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
    }
}

class Person
{
    private readonly Age _age = new Age();

    public Person()
    {
        _age.ValueChanged += OnAgeChanged;
    }

    protected void OnAgeChanged(object sender, EventArgs e)
    {
        // Do what is necessary.
    }
}

Какая структура лучше?И почему?

1 Ответ

0 голосов
/ 30 января 2019

Сначала давайте отметим несколько вещей:

  • event - это многоадресный делегат , который позволяет транслировать сообщения, сигнализирующие о возникновении действия
  • A delegate - это тип, представляющий ссылки на методы, с помощью которых мы можем их вызывать

Так что оба подхода, показанные здесь, являются «правильными» в некоторых сценариях и «неправильными» в других.Если все, что нам нужно, - это выполнить метод обратного вызова, то достаточно передать делегат.

Однако, если мы хотим реализовать шаблон «производитель-> потребитель» или любые другие шаблоны, основанные на событиях, нам понадобится eventтам.

PS Вот удивительная статья Джона Скита, где он подробно объясняет, в чем разница между событиями и делегатами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...