События C # в интерфейсах - путаница от программиста vb.net - PullRequest
1 голос
/ 04 февраля 2010

У меня реальная путаница с событиями в c # ... если у меня есть этот код в интерфейсе:

Event OnBeforeSaving(ByVal Sender As TEntity, ByVal EventArgs As CancelEventArgs)

Как это должно быть в C #? Когда я запускаю его через конвертер, он дает мне

event OnBeforeSavingEventHandler OnBeforeSaving;
delegate void OnBeforeSavingEventHandler(TEntity Sender, CancelEventArgs EventArgs);

Я не уверен, что понимаю, что происходит ... в моей голове код должен быть объединен. Это правильно?

event OnBeforeSaving(TEntity Sender, CancelEventArgs EventArgs);

Ответы [ 4 ]

9 голосов
/ 04 февраля 2010

Я не уверен, что понимаю, что происходит ... в моей голове код должен быть объединен. Это правильно?

Нет. В VB.NET вы можете объединить это в одну строку. Ключевое слово Event позволяет указать полную подпись обрабатываемого типа делегата.

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

Как говорится, в данном случае это:

delegate void OnBeforeSavingEventHandler(TEntity Sender, CancelEventArgs EventArgs);
event OnBeforeSavingEventHandler OnBeforeSaving;

Вероятно, следует заменить на это:

event EventHandler<CancelEventArgs> OnBeforeSaving;

Это связано с тем, что в платформе есть встроенный тип EventHandler<T>, соответствующий предлагаемому шаблону для событий, который указывает, что отправителем должен быть System.Object , а EventArgs должен быть подклассом EventArgs . Однако это не совсем то же самое, что ваш код VB.NET, поскольку вы ограничивали отправителя типом TEntity.

Еще лучше было бы использовать встроенный CancelEventHandler type:

event CancelEventHandler OnBeforeSaving;

Это, в основном, идентично EventHandler<CancelEventArgs>, но более ожидаемо, так как есть тип обработчика событий фреймворка специально для отмены.

1 голос
/ 04 февраля 2010

.Net требует, чтобы события имели тип делегата.

Компилятор VB автоматически создаст тип делегата; компилятор C # заставляет вас создавать его самостоятельно.

0 голосов
/ 04 февраля 2010

Эта строка:

delegate void OnBeforeSavingEventHandler(TEntity Sender, CancelEventArgs EventArgs);

определяет новый тип с именем «OnBeforeSavingEventHandler». Это тип делегата, который определяет вызов метода, который принимает параметры TEntity и CancelEventArgs и ничего не возвращает.

Эта строка:

event OnBeforeSavingEventHandler OnBeforeSaving; 

объявляет член класса, который является событием под названием «OnBeforeSaving». Это событие имеет тип «OnBeforeSavingEventHandler». Следовательно, любые объекты, которые хотят подписаться на это событие, должны иметь метод, совместимый с типом делегата OnBeforeSavingEventHandler.

0 голосов
/ 04 февраля 2010
event EventHandler<CancelEventArgs> OnBeforeSaving;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...