Является ли ключевое слово «событие» необязательным в C #? - PullRequest
16 голосов
/ 03 апреля 2009

В чем разница между eventOne (с ключевым словом 'event') и eventTwo (без ключевого слова)?

class Program
{
    public event EventHandler eventOne;
    public EventHandler eventTwo;

    public void RaiseOne()
    {
        if (eventOne != null)
            eventOne(this, EventArgs.Empty);
    }

    public void RaiseTwo()
    {
        if (eventTwo != null)
            eventTwo(this, EventArgs.Empty);
    }

    static void Main(string[] args)
    {
        var p = new Program();
        p.eventOne += (s, e) => Console.WriteLine("One");
        p.eventTwo += (s, e) => Console.WriteLine("Two");
        p.RaiseOne();
        p.RaiseTwo();
    }
}

Ответы [ 3 ]

20 голосов
/ 03 апреля 2009
  • eventOne является открытым событием , поддерживаемым закрытым полем типа EventHandler.
  • eventTwo является открытым полем типа EventHandler.

В основном событие only инкапсулирует идеи «подписаться» и «отписаться» так же, как свойство только инкапсулирует идеи «получить» и «установить», а не фактическое хранилище. (Что касается CLR, то событие может также представлять метод "повысить", но C # никогда не использует это. Игнорировать его.)

См. мою статью о событиях ( альтернативная ссылка ) для получения дополнительной информации о разнице между делегатами и событиями.

16 голосов
/ 03 апреля 2009

Используя ключевое слово event , вы говорите C # генерировать скрытые методы, add_XXX и remove_XXX для вашего основного делегата. Это гарантирует, что любой, кто использует ваш класс, может только присоединять и удалять делегатов к событию. Ключевым моментом является то, что никто не находится за пределами вашего класса и не поднимает событие, поэтому у вас есть полный контроль над тем, когда это произойдет.

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

9 голосов
/ 03 апреля 2009

Это программа для иллюстрации разницы с учетом ответов до

using System;
class Program
{
    static void Main(string[] args)
    {
        var a = new A();
        a.eventOne += (s, e) => Console.WriteLine("One");
        a.eventTwo += (s, e) => Console.WriteLine("Two");
        a.RaiseOne();
        a.RaiseTwo();
                // won't compile
        a.eventOne(null, EventArgs.Empty);
        a.eventTwo(null, EventArgs.Empty);
    }

}

class A {
    public event EventHandler eventOne;
    public EventHandler eventTwo;

    public void RaiseOne()
    {
        if (eventOne != null)
            eventOne(this, EventArgs.Empty);
    }

    public void RaiseTwo()
    {
        if (eventTwo != null)
            eventTwo(this, EventArgs.Empty);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...