Дополнительная функциональность События обеспечивают делегат - PullRequest
1 голос
/ 25 октября 2011

Как я понимаю, Event - это способ, позволяющий классу предоставлять клиентам делегаты для методов, которые должны вызываться при возникновении события. Когда происходит событие, вызывается делегат (ы), предоставленные ему его клиентами.

Но, как показано в следующем коде выше, указанная функциональность также может быть достигнута только делегатом, то есть без использования делегата.

class Program
{
    static void Main(string[] args)
    {
        ListWithChangedEvent lwce = new ListWithChangedEvent();
        lwce.delegateVariable = DelegateTestMethod;
        lwce.Add("test");

        Console.ReadLine();
    }

    public static void DelegateTestMethod(object sender, object e)
    {

    }
}

public delegate void ChangedEventHandler(object sender, object e);

public class ListWithChangedEvent : System.Collections.ArrayList
{
    public override int Add(object value)
    {
        int result = base.Add(value);
        if (delegateVariable != null)
            delegateVariable(this, "");
        return result;
    }

    public ChangedEventHandler delegateVariable;

}

Итак, мне было интересно, какие дополнительные функции предоставляет Events?

Ответы [ 3 ]

5 голосов
/ 25 октября 2011

Итак, мне было интересно, какие дополнительные функции предоставляет Event?

События предоставляют два совершенно разных преимущества по сравнению с представлением публичного делегата:

  1. You 'повторяет намерение очень ясно.Как правило, делегат публикуется для совершенно иной цели, нежели «событие» - используя событие, вы очень четко говорите: «это то, что будет затронуто в конкретный момент».Предоставление делегата обычно имеет другое значение - чаще всего делегат в общедоступном API представляет собой обязательный вход для этого API - то есть то, что используется непосредственно методом, а не необязательный механизм уведомления, запускаемыйmethod.
  2. Технически, события не являются обязательно просто делегатом.На самом деле событие имеет возможность разрешить пользовательским добавлять и удалять средства доступа , которые позволяют вручную определять, что происходит, когда подписчик подписывается или отписывается от события.Например, многие реализации ICommand.CanExecuteChanged на самом деле вообще не включают своего собственного делегата - но тихо направляют на событие CommandManager RequerySuggested .
0 голосов
/ 25 октября 2011

событие - это просто access approach для обработчика.

это не позволит вам сделать myHandler=myFunc; только с использованием += (из внешнего класса)

было сделано так, что, если другой тупой использует ваш код - он не будет разрушать вашу цепочку, используя =, поэтому вы разрешите ему только += или -=

0 голосов
/ 25 октября 2011

Ваш пример позволяет вызывать одного делегата.event - это набор делегатов, то есть вы можете += и -= отогнать свое сердце (даже во время вызова события).

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