События/Делегаты В Java или C#

Можно попробовать их (не гарантируемый):

UPS:

\b(1Z ?[0-9A-Z]{3} ?[0-9A-Z]{3} ?[0-9A-Z]{2} ?[0-9A-Z]{4} ?[0-9A-Z]{3} ?[0-9A-Z]|[\dT]\d\d\d ?\d\d\d\d ?\d\d\d)\b

UPS:

\b(1Z ?\d\d\d ?\d\w\w ?\d\d ?\d\d\d\d ?\d\d\d ?\d|[\dT]\d\d\d ?\d\d\d\d ?\d\d\d)\b

USPost:

\b(\d\d\d\d ?\d\d\d\d ?\d\d\d\d ?\d\d\d\d ?\d\d\d\d ?\d\d|\d\d\d\d ?\d\d\d\d ?\d\d\d\d ?\d\d\d\d ?\d\d\d\d)\b

, Но протестируйте перед использованием их. Я рекомендую RegexBuddy.

6
задан Saobi 15 October 2009 в 02:13
поделиться

5 ответов

(Все это с точки зрения C #.)

У меня есть статья о различиях между событиями и делегатами . Это охватывает все, что упоминается ниже, более подробно.

В основном мне нравится думать о событии как о свойстве - это пара методов, вот и все. Вместо получения / установки в событии указано «добавить / удалить», что означает «добавить этот обработчик событий» и «удалить этот обработчик событий». По сути, это все, что есть событие.

В C # также есть событий, подобных полю , которые являются ярлыками:

 public event EventHandler Foo;

объявляет как поле , так и событие с почти тривиальная реализация добавления / удаления. В классе ссылка на Foo относится к полю. Вне класса ссылка на Foo относится к событию.

Основная идея состоит в том, что событие позволяет другому коду подписаться на него и отказаться от подписки, передав делегат (обработчик события ). Обычно подписка реализуется путем создания нового делегата многоадресной рассылки, содержащего предыдущий список обработчиков событий и новый список. Поэтому, если вы храните обработчики событий в поле с именем myEventHandlers , реализация подписки может быть следующей:

myEventHandlers += value;

Аналогичным образом отмена подписки обычно включает создание нового делегата многоадресной рассылки без указанного обработчика:

myEventHandlers -= value;

Затем, когда вы хотите инициировать / активировать событие, вы просто вызываете этот делегат многоадресной рассылки - обычно с проверкой на недействительность, чтобы избежать генерации исключения, если никто не подписался:

EventHandler handler = myEventHandlers;
if (handler != null)
{
    // You could pass in a different "sender" and "args" of course
    handler(this, EventArgs.Empty);
}

Используя события, подписчики не знают друг о друге и могут ' t поднимать событие сами (обычно). Другими словами, это шаблон инкапсуляции, которому присвоен статус как в языке, так и в платформе.

8
ответ дан 8 December 2019 в 18:38
поделиться

Разница проста.

делегат - это класс с двумя полями - объект и MethodInfo.

событие - это частное поле типа делегат и два публичных метода add и remove .

Обычно под капотом события используется MulticastDelegate - это класс, унаследованный от Delegate и содержащий список делегатов. Это позволяет событию иметь несколько подписчиков.

2
ответ дан 8 December 2019 в 18:38
поделиться

Вы можете посмотреть: http://msdn.microsoft.com/en-us/library/17sde2xt.aspx

Пример продолжается здесь: http://msdn.microsoft.com/en-us/library/xwbwks95.aspx

В основном, как уже упоминалось, события - это просто особые случаи делегатов, но с изменениями в .NET 3.5 вы можете написать события без использования делегатов, хотя под капотом делегаты все еще пишутся.

Если вы посмотрите эту статью, они показывают, как использовать лямбда-выражения и анонимные функции для событий: http://msdn.microsoft.com/en-us/library/ms366768.aspx

1
ответ дан 8 December 2019 в 18:38
поделиться

.Net-события - это просто делегаты под капотом: они предоставляют некоторый синтаксический сахар в компиляторе.

Вы можете установить / сбросить делегат, но вы можете только добавить или удалить обработчик событий . Причина в том, что вам все равно, кто еще подписывается на событие, тогда как простые делегаты больше используются в сценарии «обратного вызова».

Но, в конце концов, они очень похожи.

Некоторые ресурсы:

События C # и делегаты

Делегаты и события - короткие вопросы и ответы

0
ответ дан 8 December 2019 в 18:38
поделиться

Вам нужно указать, какой язык вы хотите. Насколько мне известно, в Java нет концепции делегатов (хотя я могу ошибаться); он имеет тенденцию следовать шаблону наблюдателя для обработки событий,

C #, однако, делает. Событие в C # имеет такое же отношение к делегату, как свойство - к своему поддерживающему полю. Сам делегат - это то, что хранит указатель на функцию, которая обрабатывает событие (или, точнее, список указателей, прикрепленных к событию; я использую термин «указатель» здесь вольно).

Если я объявлю это на C # :

public event EventHandler MyEvent;

И вызывайте событие следующим образом:

MyEvent(this, EventArgs.Empty);

На самом деле это просто сокращение для полной реализации события:

private EventHandler myEventHandler;

public event EventHandler MyEvent
{
    add { myEventHandler += value; }
    remove { myEventHandler -= value; }
}

И вызывая его ...

myEventHandler(this, EventArgs.Empty);

Все это означает, что настоящее событие предоставляет две операции: add и remove , которые используются кодом-потребителем для присоединения своих обработчиков событий к событию. В обозначении по умолчанию (сокращенном) компилятор создает частный экземпляр члена типа делегата и использует его так, как я описал выше. Когда ты "

2
ответ дан 8 December 2019 в 18:38
поделиться