首页 新闻 会员 周边 捐助

c#委托求解密

0
[已解决问题] 解决于 2017-01-07 23:00

委托到底是什么,委托该怎么用,不大理解,求大牛们详解,或demo



奔跑的熊猫的主页 奔跑的熊猫 | 初学一级 | 园豆:94
提问于:2017-01-04 23:22
< >
分享
最佳答案
0

委托是种特殊的引用类型,你定义的任何委托都是从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及他们的泛型变种的加持,你额外定义那个委托都可以省略,写起来不要太花哨~

 

奖励园豆:5
Daniel Cai | 专家六级 |园豆:10424 | 2017-01-05 10:04
其他回答(1)
0

说一把拉你太难理解,你从字面理解即可,这些术语字面意思往往都是比较准确的;

—— 所以你可以这么理解,比如你需要去拿包裹,又不想自己直接去,所以委托你婆娘去。(过程函数就是拿包裹,现在加了个委托->你婆娘)

好好理解字面意思,道理需要用的时候,你就会想到用他了。

花飘水流兮 | 园豆:13617 (专家六级) | 2017-01-05 11:22

z和个比喻很恰当

支持(0) 反对(0) 糯米好吃 | 园豆:64 (初学一级) | 2017-01-06 12:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册