2008-11-20 53 views

回答

3

Funcs和Actions是代表新的“类型”,我在Linq和其他奇怪的情况下使用它们很多。对LINQ他们是很好,因为我个人宁愿有一个描述性的名称比一个lambda表达式:

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

与函数求哪里可以:

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

这可能是一个更行,但有是我发现自己在课堂上多次重复某些lambda表达式的时候,所以我个人认为Funcs对此很好。

另一种情况是,缺少一个更好的术语,方法工厂。基本上,它是保存操作作为值的列表,并说一个枚举的关键一本字典:

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

不要忘记lambda表达式 – 2008-11-20 18:49:01

6

我使用C#使用Event委托大部分时间。

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

那么,与lambda表达式在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

我曾经一直在Daok所说的事件中一直使用它们,直到我得知可以对大多数常见事件使用内置处理程序(至少对我来说是常见的)。现在我通常将它们用作API交互的回调处理程序。

相关问题