2008-11-20 5 views
3

Делегаты выглядят как такая мощная языковая функция, но мне еще предстоит найти возможность использовать их в гневе (кроме как в DAL, я должен сказать).C# делегаты - как часто вы их используете, и когда?

Как часто вы их используете и при каких обстоятельствах вы считаете их наиболее полезными?

ответ

3

Funcs and Actions - это новые «типы» делегатов, и я использую их много с Linq и действительно другими странными ситуациями. Для Linq они хороши, потому что лично я предпочел бы иметь описательное имя, чем лямбда-выражения:

someList.Select(item => item.Name); 

Где с Func я могу:

Func<Item, String> itemName = item => item.Name; 
... 
someList.Select(itemName); 

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

Другая ситуация - из-за отсутствия лучшего термина Method Factory. В основном это словарь, который содержит список действий, как значение и говорят об Enum в качестве ключа:

Dictionary<UserType, Action<User>> showControls; 
showControls = new Dictionary<UserType, Action<User>>(); 

showControls.Add(SomeEnum.Admin, setControlsForAdmin); 
showControls.Add(SomeEnum.Normal, setControlsForNormalUser); 
showControls.Add(SomeEnum.Unregistered, setControlsForUnregisteredUser); 

И тогда у меня есть методы сами выписанных в другом месте на странице. И использование будет:

showControls[user.UserType](); 

Или, может быть, вы хотите передать сам метод другому:

Action<User> neededMethod; 

neededMethod = showControls[user.UserType]; 

SomeMethod(neededMethod); 

Я уверен, что есть гораздо лучшее применение для делегатов, но они полезны.

0

Я использую их больше всего для обратных вызовов. Вместо объектов для методов обратного вызова (с использованием интерфейсов) я могу обернуть метод в делегат и передать это.

4

Я использую их для обработчиков событий, обратных вызовов и предикатов, чтобы назвать несколько. Если вы запрограммировали на C++, вы можете думать о них как о указателях функций, и я думаю, что некоторые из их применений становятся очевидными.

+0

не забудьте Лямбдами – 2008-11-20 18:49:01

6

Я использую C# Делите большую часть времени на Событие.

public delegate void MyDelegate(object sender, EventArgs e, string otherParameterIWant); 
//...Inside the class 
public event MyDelegate myEvent; 
//...Inside a method 
if (myEvent != null) 
    myEvent(this, new EventArgs(), "Test for SO"); 
1

События, Предикатные Поиски, иногда рядный функциональность .. они пригодятся в тонне scenarious ..

List.ForEach (делегат ...)

1

Ну, с лямбда-выражения добавленные в C# 3, они становятся намного проще в использовании, поскольку грязные части скрыты.

myList.Sort(a=> a.LastName); 
3

мне особенно нравится делегатов, когда вы должны изменить одну вещь в середине шаблонного кода:

public delegate bool ItemFilterDelegate(MyItem item); 

public IEnumerable<MyItem> FilterItems(ItemFilterDelegate filter) 
{ 
    var result = new List<MyItem>(); 

    foreach(MyItem item in AllItems) 
    { 
     if(filter(item)) 
      result.Add(item); 
    } 

    return item; 
}  

public IEnumerable<MyItem> FilterByName(string name) 
{ 
    return FilterItems(item => item.Name == name); 
} 

Они также активно используются таким образом, с помощью LINQ.

+0

В качестве примечания, то ItemFilterDelegate может быть полностью заменен Func если вы хотите, но Я думаю, что назвать это может быть немного более читаемым. – 2008-11-20 18:51:26

0

Я использовал их все время, так как Даок говорит о событиях, пока не узнал, что вы можете использовать встроенные обработчики для большинства распространенных событий (как правило, для того, что я делаю, по крайней мере). Теперь я обычно использую их как обработчики обратного вызова для взаимодействия с API.

Смежные вопросы