2010-02-21 2 views
2

Каков правильный шаблон проектирования для пользовательских событий в .NET (VB или C#).Шаблон проектирования для пользовательских событий в .NET.

Обратите внимание: я ссылаюсь на пользовательские события, где вы переопределяете методы AddHandler, RemoveHander и RaiseEvent.

+0

Существует не шаблон дизайна. Есть семантика интерфейса: 'RemoveHandler' должен уметь удалять вещи, добавленные с помощью AddHandler', и не должен жаловаться, если его попросят сделать то же самое дважды подряд. Но кроме того, вы можете делать все, что хотите, в конце концов, это должно переопределить поведение. –

+0

«Design Pattern» Я имею в виду «шаблон, который большинство людей используют при проектировании X, чтобы обеспечить правильную семантику и безопасность потоков». О каком определении вы думали? –

+1

Я не думаю, что пользовательские события потребовали собственных шаблонов, потому что настройки не очень широко используются или требуются. 1. Почему вам необходимо переопределить эту базовую функциональность? 2. «Правильный шаблон дизайна? Шаблон должен дать вам осмысленный способ обсудить, что вы делаете - это не руководство для того, как построить решение. Если вы запрашиваете правильный шаблон для своих нужд, не предоставляя никакой информации о том, что это такое, вы уже ошибаетесь. – Jake

ответ

-1

1 Рекомендации по созданию событий - это путь Microsoft, то есть: делегат принимает 2 параметра, первым является отправитель (кто вызывает событие?) Объекта типа и аргументы (дополнительная информация о событие) типа EventArgs или любого производного типа. Также не возвращайте значение (void) из события и поместите все данные, которые вам нужны во втором аргументе. Проверьте example in this link.

2 Потокобезопасности другая история, но вы можете начать с этих советов (от MSDN):

В общем, избежать блокировок на общедоступном типа, или случаи за пределами вашего кода управления. Общие конструкции блокировки (это), замок (TypeOf (MyType)), и замок ("myLock") нарушают этот ориентир:

* lock (this) is a problem if the instance can be accessed publicly. 

* lock (typeof (MyType)) is a problem if MyType is publicly accessible. 

* lock(“myLock”) is a problem because any other code in the process using the same string, will share the same lock. 

Лучшая практика заключается в определении собственной объект для блокировки на, или частной статической переменной для защиты общих данных ко всем экземплярам.

пример:

Object thisLock = new Object(); 
lock(thisLock) 
{ 
    // Critical code section. 
} 
Смежные вопросы