Когда я буду использовать делегата в asp.net? - PullRequest
9 голосов
/ 11 марта 2009

Я всегда ищу способ использовать все инструменты, которые могу, и растянуть себя за пределы того, где я нахожусь. Но сколько бы я ни читал о делегатах, я никогда не смогу найти место для их использования (например, Интерфейсы, Обобщение и многое другое, но я отвлекся). Я надеялся, что кто-то сможет показать мне, когда и как они используют делегата в web программирование для asp.net c # (2.0 и выше).

Спасибо, и если это неправильно для переполнения стека, пожалуйста, дайте мне знать.

Ответы [ 8 ]

7 голосов
/ 11 марта 2009

bdukes прав насчет событий. Но вы не ограничены использованием делегатов с событиями.

Изучите классический шаблон наблюдателя для получения дополнительных примеров использования делегатов. Часть текста в шаблоне указывает на модель событий, но с точки зрения необработанного обучения вам не нужно использовать события.

Одна вещь, которую следует запомнить: делегат - это просто еще один тип, который можно использовать и передавать, аналогично вашим примитивным типам, таким как "int". И точно так же, как «int», делегат имеет свои особые характеристики, которые вы можете использовать в своем коде при использовании типа делегата.

Чтобы действительно хорошо разобраться в этом вопросе, а также в некоторых его более сложных и подробных аспектах, возьмите книгу Джо Даффи, .NET Framework 2.0 .

6 голосов
/ 11 марта 2009

Ну, когда вы обрабатываете событие, вы используете делегата.

3 голосов
/ 11 марта 2009

Чтобы ответить на ваш второй вопрос первым, я думаю, что это отличный вопрос для StackOverflow!

В первом случае одним из примеров будет сортировка. Метод Sort () в List принимает делегата для выполнения сортировки, как и метод Find (). Я не большой поклонник сортировки в базе данных, поэтому мне нравится использовать Sort () в моих наборах результатов. В конце концов, порядок списка - это скорее проблема пользовательского интерфейса (обычно), чем проблема бизнес-правил.

Редактировать: я добавил свои причины для сортировки вне БД к соответствующему вопросу здесь .

Редактировать: функция сравнения, используемая в процедуре сортировки, является делегатом. Поэтому, если вы сортируете List с помощью метода .Sort (Comparison (T)), метод Comparison (T), который вы передаете функции сортировки, является делегатом. См. Сортировка (Сравнение (T)) Документация .

2 голосов
/ 11 марта 2009

Еще одним быстрым примером, который я бы выбрал из головы, было бы модульное тестирование с помощью Rhino Mocks. Многие вещи, которые вы можете делать с Rhino Mocks, используют делегаты и лямбда-выражения.

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

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

Помимо прочего, мы используем делегатов для:

  • Сортировка и фильтрация, особенно если пользователь может выбирать между различными критериями сортировки / фильтрации
  • Упрощение кода. Например, длинный процесс, в котором начало и конец всегда одинаковы, но небольшой средний бит меняется. Вместо трудно читаемого блока if в середине, у меня есть один метод для всего процесса, и я передаю делегат (Action) для среднего бита.
  • У меня есть очень полезный метод ToString в моем уровне представления, который преобразует коллекцию чего-либо в список через запятую. Параметрами метода являются IEnumerable и Func-делегат для преобразования каждого T в коллекции в строку. Он одинаково хорошо работает как для объединения пользователей по имени, так и для перечисления проектов по их идентификатору.
1 голос
/ 11 марта 2009

Недавно я использовал делегатов для «делегирования» проверки разрешений.

public Func CheckPermission;

Таким образом, функция CheckPermission может совместно использоваться различными элементами управления или классами, скажем, в статическом классе или классе утилит, и все же управляться централизованно, избегая также взрыва интерфейса; просто мысль

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

Другим примером может быть публикация событий для пользовательских элементов управления.

Например.

// In your user control
public delegate void evtSomething(SomeData oYourData);
public event evtSomething OnSomething;

// In the page using your user control
ucYourUserControl.OnSomething += ucYourUserControl_OnSomething;

// Then implement the function
protected void ucYourUserControl_OnSelect(SomeData oYourData)
{
   ...
}
1 голос
/ 11 марта 2009

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

Использование делегата: бизнес-приложения

Где я могу использовать делегатов?

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