代表看起来像一个如此强大的语言功能,但我还没有找到机会在愤怒中使用它们(我必须说在 DAL 中除外)。
您多久使用一次?在什么情况下您觉得它们最有用?
我大部分时间使用 C# Delegate 和 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");
我将它们用于事件处理程序、回调和谓词等等。如果您使用 C++ 编程,您可以将它们视为函数指针,我认为它们的一些用途会立即显现出来。
当您必须在样板代码中间更改一件事时,我特别喜欢代表:
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 一起大量使用。
Funcs 和 Actions 是代表的新“类型”,我在 Linq 和其他奇怪的情况下经常使用它们。对于 Linq,它们很好,因为我个人宁愿使用描述性名称而不是 lambda 表达式:
someList.Select(item => item.Name);
我可以在哪里使用 Func:
Func<Item, String> itemName = item => item.Name;
...
someList.Select(itemName);
可能会多出一行,但有时我发现自己在课堂上重复了几次特定的 lambda 表达式,所以我个人认为 Funcs 可以很好地解决这个问题。
另一种情况是,由于缺乏更好的术语,方法工厂。基本上,它是一个字典,其中包含一个 Actions 列表作为值,并说一个 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);
我确信代表有更好的用途,但这些很有用。
事件,谓词搜索,有时是内联功能......它们在大量场景中都很有用......
List.ForEach(代表...)
好吧,在 C#3 中添加了 lambda 表达式,它们变得更容易使用,因为杂乱的部分被隐藏了。
myList.Sort(a=> a.LastName);
我最常使用它们进行回调。代替回调方法的对象(使用接口),我可以将方法包装在委托中并传递它。
正如 Daok 所说的那样,我曾经一直使用它们来处理事件,直到我了解到您可以将内置处理程序用于大多数常见事件(至少对我所做的事情来说很常见)。现在我通常将它们用作 API 交互的回调处理程序。