[C#]委托的两种用法

 

在《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作为参数,而避免添加多余的成员变量用于传递参数。


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值