想象一个场景,您有一个搜索客户的函数。最初您只想按名称搜索,因此您可以编写如下内容:
public Customer Find(string name)
{
foreach (var customer in database.Customers)
if (customer.Name == name)
return customer;
}
然后你的规范改变了,你必须实现新的搜索方式(比如说“按地址搜索”)。没问题,我们将旧代码重构为:
public Customer FindByName(string name)
{
foreach (var customer in database.Customers)
if (customer.Name == name)
return customer;
}
public Customer FindByAddress(string address)
{
foreach (var customer in database.Customers)
if (customer.Address == address)
return customer;
}
它们看起来非常相似,不是吗?
现在您的老板再次告诉您添加另一个搜索功能,用户可能希望通过电话号码查找客户。越来越无聊了,不是吗?
幸运的是,开发人员已经找到了一种让其他开发人员的生活更轻松的方法来发明委托。使用它们,您可以创建一个更大的通用函数,帮助您避免一次又一次地重写相同的代码。
public Customer Find(Predicate<Customer> p)
{
foreach (var customer in database.Customers)
if (p(customer))
return customer;
}
现在,您不必在每次需要一种新的搜索客户方式时都创建一个专门的函数,因此您可以编写:
var byName = Find(a => a.Name == "lorem");
var byAddress = Find(a => a.Address == "ipsum");
var byTelephone = Find(a => a.Telephone == "dolor");
委托对于管理事件也很有用,并且在 LINQ 中也被大量使用。只需谷歌“delegates c#”,您就会发现一个巨大的新世界!:)