委托到底是什么,委托该怎么用,不大理解,求大牛们详解,或demo
委托是种特殊的引用类型,你定义的任何委托都是从MulticastDelegate派生(实现挂接后的委托链表),比如
delegate void EventHandler(object sender,EventArgs)这种在编译后会生成一个class,这个class里面包含了同步及异步调用的方法。由于c#里面没有显式指针(unsafe除外),因此能够通过这种方式指向一个方法。比如你有一个筛选方法,其内部实现是根据各种条件做判断最后返回筛选的结果
foreach(var element in collection)
{
if(!yourConditionApplyon(element))
continue;
yield return element;
}
如果没有委托那么其中的yourConditionApplyon方法将很难用代码来描述,因为这个方法的实现并不是你在编写上述代码时就知道,这个是使用方才知道。
如果用委托就很容易实现,使用方可以通过委托把实际过滤条件代入,比如
yourConditionApplyon可能的实现:IsOk(Element element) 或IsSuitable(Element element,DateTime dt)
但这里又出现了一个很纠结的问题,c#这种静态代码有很强的语法限制,在编译时必须确认你这个方法的签名到底是什么样的(dynamic除外),否则yourConditionApplyon这个方法到底是几个参数是无法推断出来的。
因此你需要显式定义一下,让所有人都知道,这个方法我是只需要一个element的,返回bool,因此你就有了这样一个委托
delegate bool ConditionCheck(Element element);
那么你的这个过滤方法就变成这样的形式
IEnumerable<Element> Filter(IEnumerable<Element> collection,ConditionCheck condition)
{
//..省略防御判断
foreach(Element element in collection)
{
if(!condition(element))
continue;
yield return element;
}
}
在使用方用的时候也容易,只需要照葫芦画瓢,写一个方法签名和委托一样的方法即可
bool SomeJudgementBlabla(Element e)
{
return .......;
}
最后只需要Filter(collection,SomeJudgement)就完了。
当然实际使用中不这样玩,在lambda出来后就很花了,配合匿名方法这里根本就不需要额外写个方法
Filter(collection,e=>your condition here)
加上框架自带的几个委托定义Action,Func及他们的泛型变种的加持,你额外定义那个委托都可以省略,写起来不要太花哨~
说一把拉你太难理解,你从字面理解即可,这些术语字面意思往往都是比较准确的;
—— 所以你可以这么理解,比如你需要去拿包裹,又不想自己直接去,所以委托你婆娘去。(过程函数就是拿包裹,现在加了个委托->你婆娘)
好好理解字面意思,道理需要用的时候,你就会想到用他了。
z和个比喻很恰当