A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

看书看的不是很明白,哪位能给我由浅入深的详细讲解一下啊    先谢谢了

5 个回复

倒序浏览
现实世界里:妈妈委托小新去买东西
代码世界里:
1.新建蜡笔小新CrayonShinChan类,其中有个买东西的方法
  1. using System;

  2. namespace test14
  3. {
  4. internal class CrayonShinChan
  5. {
  6. public static void BuyThings()
  7. {
  8. Console.WriteLine("妈妈,东西买好了!");
  9. }
  10. }
  11. }
复制代码
2.主方法中,申明委托并附上具体方法
  1. using System;

  2. namespace test14
  3. {
  4. internal class Program
  5. {
  6. public delegate void DoDeedEventHandler();

  7. private static void Main(string[] args)
  8. {
  9. DoDeedEventHandler doDeedDelegate = new DoDeedEventHandler(CrayonShinChan.BuyThings);

  10. doDeedDelegate();
  11. Console.ReadKey();
  12. }
  13. }
  14. }
复制代码
说明:
1.委托关键字delegate。

2.DoDeedEventHandler其中的EventHandler是一个申明委托的微软C#的命名标准。
3.在new一个委托实例的时候,new DoDeedEventHandler(委托的方法),委托的方法必须要加上,因为委托的构造函数是不为空的。
4.上面的例子简单,其实委托的参数和返回值类型,都要和你要具体委托的方法要一致。

这就是极简单的委托
3.妈妈让小新去买东西后,还要他带小白去散步
在蜡笔小新的类中添加散步的方法
  1. public static void TakeWalk()
  2. {
  3. Console.WriteLine("妈妈,小白说它今天不想散步!");
  4. }
复制代码
在主方法中修改
  1. DoDeedEventHandler doDeedDelegate = new DoDeedEventHandler(CrayonShinChan.BuyThings);
  2. <STRONG><FONT color=darkred>doDeedDelegate += CrayonShinChan.TakeWalk;
  3. </FONT></STRONG>
  4. doDeedDelegate();
  5. Console.ReadKey();
复制代码

这样即可。这就是委托链的概念。

委托和事件没有可比性,因为委托是类型,事件是对象。但我们可以比较用委托方式实现的事件与标准event事件的区别。

我们经常说,定义一个按钮,然后触发按钮的点击事件。说明事件是可以被外部“注册自己+=”和“注销自己=-”的,但delegate就没有办法这样控制。委托中可以添加别人的方法,用一个,用两个......
(以上仅是自己的理解......)








评分

参与人数 1技术分 +1 收起 理由
赵宗荣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
看的还是有点迷糊,我还是动手敲几次吧,一次不懂两次  两次不懂就5次  。。。。
不过还是谢谢你
回复 使用道具 举报
本帖最后由 sxdxgzr@126.com 于 2013-7-30 12:39 编辑

事件是说某个对象(事件发布者)发生了某件事情然后通知其他对象(事件订阅者)的这个过程。.net里面事件的机制建立在委托的基础上,用来通知使用的中介就是委托。用event关键字定义的事件,确实对委托进行了封装,类似于属性。委托是对方法的封装,使得方法可以类型安全的当作参数传递。二者概念上来看并没有什么关系,只是事件机制的实现用到了委托。
回复 使用道具 举报
委托是C#中新加入的一个类型,可以把它想作一个和Class类似的一种类型,和使用类相似,使用一个委托时,需要两个步骤,首先你要定义一个委托,就像是定义一个类一样-->public delegate void GreetingDelegate(string name);
然后,你可以创建一个或多个该委托的实例;-->
private static void 方法1(string name){ConSole.WriteLine(name);}   
private static void 方法2(string name){ConSole.WriteLine(name);}
委托使用:
private static void GreetPeople(string name, GreetingDelegate MakeGreeting)
{
     MakeGreeting(name);
}
static void Main(string[] args)
{
     GreetPeople("111", 方法1);
     GreetPeople("222", 方法2);
     Console.ReadKey();
}
委托使用的情况:
当你确定要处理一件事,但又不能确定处理方法时,可以考虑用委托;
实际项目中貌似还真少见用委托的~~~
回复 使用道具 举报
自己也跟着学习下~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马