Есть ли что-то, что вы можете сделать с событием C #, что вы не можете сделать с событием VB? - PullRequest
3 голосов
/ 31 марта 2009

Мой друг - прежде всего разработчик VB, и он снова и снова говорит, насколько проще кодировать события в VB, чем C #. Я полагаю, что это проще, но если бы не было причины для дополнительной сложности, они, вероятно, сделали бы это так же просто в C #. Может кто-нибудь сказать мне, есть ли какая-либо дополнительная гибкость или вообще какая-либо способность, которая может быть сделана с событиями C #, а не событиями VB.Net?

Ответы [ 5 ]

4 голосов
/ 31 марта 2009

Единственное, что приходит на ум для C #, - это возможность подписаться на пустое возвращаемое событие (практически все события) с помощью анонимной функции. VB.Net 9.0 поддерживает только лямбда-выражения, которые возвращают значение (это исправлено в VB 10.0).

VB обладает некоторой гибкостью, отсутствующей в C # в отношении событий

  • Поддержка Расслабленных делегатов . Это позволяет VB использовать обработчики событий, которым требуется только подмножество параметров в типе события (в основном используется с пустыми функциями параметров)
  • Предложение Handles значительно упрощает удаление событий, сгенерированных дизайнером, в отличие от C #, где нужно копаться в файле .Designer.cs
  • Ключевое слово RaiseEvent исключает проблему проверки пустых событий в VB.Net
2 голосов
/ 31 марта 2009

Большую часть времени я предпочитаю VB, а не C #, но я довольно хорошо разбираюсь в обоих.

Вдоль моей головы есть два места, которые я знаю, где VB.Net делает это проще. Во-первых, вам не нужно проверять null перед тем, как инициировать событие. Там может быть некоторый компромисс, но я не знаю об этом.

Другое - это добавление ключевого слова Handles. Вы можете объявить полный метод для обработки события и связать его с событием в одном выражении. Это определенное преимущество для VB, потому что вы могли бы делать все в полной форме без этого ключевого слова. Это просто лишний кусочек синтаксического сахара. Единственный способ сделать это в C # - использовать лямбда-выражение / анонимный делегат.

Остальная часть синтаксиса в значительной степени стирка: вы предпочитаете "+=" или "AddHandler"?

1 голос
/ 31 марта 2009

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

Public Event OnChange(ByVal Text As String)

Я не уверен, что это хорошо, но ...

Также - не RaiseEvent не обрабатывает нули (события без подписки) автоматически? Тривиально, конечно.

0 голосов
/ 03 апреля 2009

В C # вы можете иметь виртуальные события и переопределять их в производном классе. В VB.NET такого нет.

0 голосов
/ 31 марта 2009

Ваш друг, вероятно, привык создавать обработчики событий, выбирая элемент управления и событие из двух комбинированных списков в верхней части исходной кодовой страницы. Где, как в C #, вы вручную кодируете обработчик + =.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...