在《C#入门经典》第四版中看到,定义和使用委托的方法,通常是写好相应的委托函数,然后将函数名传入。但是这样在进入被委托执行的函数时,需要使用的变量又不可见,必须添加成员变量。
例如,User是我定义的一个用户类,UserManagement类中的成员变量UserList是一个List<User>对象,储存一个用户列表。我需要在UserManagement类中加一个RemoveUser成员函数,以用户的ID为索引在UserList中找到这个User并删除它。
考虑使用.NET类库中泛型类LIST<T>的函数:T Find(Predicate<T> match),查MSDN发现Predicate<T>是一个以T对象为参数,返回bool的委托:
public delegate bool Predicate<T>(
T obj
)
Find函数将List<T>中的每一个T类对象作为参数传给match,直到第一个使match返回true的对象停止,返回这个对象T。
为了使用这个函数,我这样写:
1.在类中添加变量
String TargetID;
2.定义Predicate类的一个对象:
Predicate<User> p1=new Predicate<User>(FindByID);
3.定义函数:
bool FindByID(User user)
{
if(user.ID==TargetID)
return true;
else
return false;
}
4.得以实现RemoveUser函数:
public void RemoveUser(string TargetID)
{
this.TargetID=TargetID;
User TargetUser=UserList.Find(p1);
UserList.Remove(TargetUser);
}
但是这样让UserManagement类中凭空增添了一个成员变量TargetID,不太好。
而MSDN上有如下用法:
直接定义RemoveUser函数:
public void RemoveUser(string TargetID)
{
User TargetUser = UserList.Find(
delegate(User u)
{
if (u.ID == ID)
return true;
else
return false;
});
UserList.Remove(TargetUser);
}
在Find参数中直接传入无名委托,在实现代码中可以直接使用此函数中的TargetID作为参数,而避免添加多余的成员变量用于传递参数。