Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Необходимость ключевого слова event для языка C#, Не избыточно ли ключевое слово event? 
:(
    Опции темы
valent_N
Дата 11.12.2005, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 9.8.2003
Где: Рига, Латвия

Репутация: нет
Всего: 1



Здравствуйте! Буду очень благодарен, если кто-то поможет разрешить для меня вопрос о необходимости ключевого слова event для языка C#? Не избыточно ли оно и не имеет ли оно лишь декоративный характер? Ведь без него можно вполне обойтись, используя делегаты. Причем не в том смысле, что можно написать другой код, а в том, что можно просто удалить это слово в комментарий, как это сделано ниже с кодом, сгенерированным MS Visual Studio 2003 .NET:
Код

using System;

namespace ConsoleApplication1
{
    // Делегат для события
    delegate void MyEventHandler();

    // Класс события,
    class MyEvent 
    {
        public /*event*/ MyEventHandler SomeEvent; // Событие

        // Генерирование события,
        public void OnSomeEvent() 
        {
            if(SomeEvent != null)
                SomeEvent();
        }
    }
    
    class Class1
    {
        // Обработчик события,
        static void handler() 
        {
            Console.WriteLine("Произошло событие.");
        }

        [STAThread]
        static void Main(string[] args)
        {
            MyEvent evt = new MyEvent();
            // Добавляем метод handler() в список события,
            evt.SomeEvent += new MyEventHandler(handler);
            // Генерируем событие,
            evt.OnSomeEvent();
        }
    }
}

Без event или с ним, но вышеприведенная программа работает одинаково . Может есть случаи, когда это неверно?
Спасибо! smile
PM MAIL   Вверх
mr.DUDA
Дата 11.12.2005, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Во-первых, событие можно включить в интерфейс, в то время как делегат - нельзя (интерфейс не может содержать поле, поэтому придётся делать делегат вычисляемым свойством, реализованным в каждом классе, а это, согласитесь, уже небольшой изврат).

Во-вторых, у события можно переопределить логику подключения / отключения обработчика, а у делегата - нельзя:
Код
    // Класс события,
    class MyEvent
    {
        event MyEventHandler _someEvent;
        public event MyEventHandler SomeEvent // Событие
        {
            add
            {
                _someEvent += value;
                Console.WriteLine("Добавлен обработчик: " + value.Method.DeclaringType.FullName + "." + value.Method.Name.ToString());
            }
            remove
            {
                _someEvent -= value;
            }
        }

        // Генерирование события,
        public void OnSomeEvent()
        {
            if(_someEvent != null)
                _someEvent();
        }
    }


Может, есть какие-то другие отличия, я их не нашёл.


--------------------
user posted image
PM MAIL WWW   Вверх
valent_N
Дата 11.12.2005, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 9.8.2003
Где: Рига, Латвия

Репутация: нет
Всего: 1



Уважаемый Mr.Duda!
Большое Вам спасибо за обстоятельный ответ!
С почтением,
Валентин

PM MAIL   Вверх
mr.DUDA
Дата 11.12.2005, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



пожалуйста smile


--------------------
user posted image
PM MAIL WWW   Вверх
Medved
Дата 20.12.2005, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 3
Всего: 154



К тому же использований событий соответствует хорошей пардиаграмме ООП.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0474 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.