回答
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);
我敢肯定有供代表们更好的用途,但这些都是有用的。
我使用它们最多的回调。代替回调方法的对象(使用接口),我可以将一个方法包装在委托中并传递给它。
我将它们用于事件处理程序,回调函数和谓词等等。如果你已经用C++编程,你可以把它们看作函数指针,我认为它们的一些用法立刻就显现出来了。
我使用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");
活动,谓语搜索,有时内嵌功能..他们派上用场一吨的scenarious ..
List.ForEach(委托...)
那么,与lambda表达式在C#3中添加,它们变得更容易使用,因为杂乱的部分是隐藏的。
myList.Sort(a=> a.LastName);
我特别喜欢代表当你有样板代码中间变出一两件事:
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大量使用。
作为一个侧面说明,ItemFilterDelegate可以完全取代Func键
我曾经一直在Daok所说的事件中一直使用它们,直到我得知可以对大多数常见事件使用内置处理程序(至少对我来说是常见的)。现在我通常将它们用作API交互的回调处理程序。
- 1. 代表什么是代表以及何时使用它?
- 2. gwan动态缓冲区,多久使用一次以及何时不使用它?
- 3. ViewBag,ViewData,TempData,Session - 如何以及何时使用它们?
- 4. 字体:什么,何时以及如何使用它们?
- 5. INotifyCollectionChanged - 它多久发一次(以及它们如何使它如此高效/快速)?
- 6. Python中的嵌套字典:如何使它们以及如何使用它们?
- 7. html标题等级以及何时使用它们
- 8. @stateful和@sessionScoped - 区别以及何时正确使用它们?
- 9. SSL - 如何以及何时使用它
- 10. 类,以及它们如何涉及到另一个在C#
- 11. 何时抛出异常以及何时记录它们?
- 12. ObjectSpace - 它是什么以及人们如何使用它?
- 13. C++中的堆栈。他们为什么以及何时使用?
- 14. 什么是C#迭代器和生成器,以及如何利用它们
- 15. &H57代表什么以及如何将它翻译为C#?
- 16. 什么是表达树,您如何使用它们,以及为什么要使用它们?
- 17. winio64.dll中有什么方法以及如何使用它们
- 18. 我应该了解多线程以及何时使用它,主要在C++中
- 19. AppDelegate.swift和Main.swift以及如何使用它们
- 20. Kubernetes有关的秘密,以及如何使用它们荚
- 21. 宏以及如何跟踪它们
- 22. 重复以及如何摆脱它们
- 23. react - 如何实例化组件以及它们何时相同?
- 24. XSD注释和文档元素,以及如何使用它们
- 25. MAC OSX dylib的,以及如何使用它们
- 26. 什么是StringIndexer,VectorIndexer以及如何使用它们?
- 27. Revit中的布尔型变量以及如何使用它们
- 28. 了解BaseAdapters以及如何使用它们
- 29. 什么是InputStream和输出流?为什么以及何时使用它们?
- 30. 你有多久保持会话cookie?
不要忘记lambda表达式 – 2008-11-20 18:49:01