Научно-образовательный IT-форум при КНИТУ-КАИ

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Научно-образовательный IT-форум при КНИТУ-КАИ » Задачи и вопросы » [+] Чем отличается событие от делегата?


[+] Чем отличается событие от делегата?

Сообщений 1 страница 2 из 2

1

Обратите внимание на программный код:

Код:
using System;

// Declare a delegate type for an event.  
delegate void MyEventHandler();

// Declare a class that contains an event. 
class MyEvent
{
    public event MyEventHandler SomeEvent;

    // This is called to raise the event. 
    public void OnSomeEvent()
    {
        if (SomeEvent != null)
            SomeEvent();
    }
}

class EventDemo
{
    // An event handler. 
    static void Handler()
    {
        Console.WriteLine("Event occurred.");
    }

    static void Main()
    {
        MyEvent evt = new MyEvent();

        // Add Handler() to the event list. 
        evt.SomeEvent += new MyEventHandler(Handler);

        // Raise the event. 
        evt.OnSomeEvent();
    }
}

Если исключить из программы ключевое слово event, то ничего не изменится. Вопрос, который обозначен в заголовке, остается предметом обсуждением многих. Поэтому давайте попробуем вместе разобраться и ответить на вопрос полно и внятно.

2

На данный момент мне известны следующие отличия:

1. События предназначены для многоадресатной передачи, они должны возвращать значение типа void. Поэтому события поддерживают только операторы “+=” и “-=”.

2. Позволяет управлять списком обработчиков событий, используя форму event-инструкции, которая позволяет использовать средства доступа к событиям. Эти средства доступа дают возможность управлять реализацией списка обработчиков событий. Упомянутая форма имеет следующий вид:

Код:
event событийный_делегат имя_события {
  add {
  // Кол добавления события в цепочку событий.
  }
  remove {
  // Код удаления события из цепочки событий.
  }
}

Эта форма включает два средства доступа к событиям: add и remove. Средство доступа add вызывается в случае, когда с помощью оператора “+=” в цепочку событий добавляется новый обработчик, а средство доступа remove вызывается, когда с помощью оператора “-=” из цепочки событий удаляется новый обработчик. Средство доступа add или remove при вызове получает обработчик, который необходимо добавить или удалить, в качестве параметра. Этот параметр, как и в случае использования других средств доступа, называется value. При реализации средств доступа add и remove можно задать собственную схему хранения обработчиков событий.

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

Код:
namespace ImplementInterfaceEvents  
{  
    public interface IDrawingObject  
    {  
        event EventHandler ShapeChanged;  
    }  
    public class MyEventArgs : EventArgs   
    {  
        // class members  
    }  
    public class Shape : IDrawingObject  
    {  
        public event EventHandler ShapeChanged;  
        void ChangeShape()  
        {  
            // Do something here before the event…  

            OnShapeChanged(new MyEventArgs(/*arguments*/));  

            // or do something here after the event.   
        }  
        protected virtual void OnShapeChanged(MyEventArgs e)  
        {  
            if(ShapeChanged != null)  
            {  
               ShapeChanged(this, e);  
            }  
        }  
    }  
}


4. События можно определять как абстрактные. Обеспечить реализацию такого события должен производный класс. Однако события, реализованные с использованием средств доступа add и remove, абстрактными быть не могут.

5. Событие может быть виртуальным, т.е. его можно переопределить в производном классе.

6. Любое событие можно определить с помощью ключевого слова sealed. Модификатор sealed можно использовать для метода, свойства или события, которое переопределяет виртуальный метод, свойство или событие в базовом классе. Это позволяет классам наследовать от вашего класса, запрещая им при этом переопределять определенные виртуальные методы, свойства или события.

7. Возбудить событие MyEvent может только класс владелец, так как оно заменяется закрытым полем в ходе компиляции.

Если у кого-то есть собственные соображения по этому поводу, то пишите, мне будет интересно услышать другие мнения.


Вы здесь » Научно-образовательный IT-форум при КНИТУ-КАИ » Задачи и вопросы » [+] Чем отличается событие от делегата?