何种情况下使用委托?

mmbf001 2009-04-28 10:36:28
不管了MSDN上的例子 还是C#高级编程里的例子 都看了下...
感觉为什么一定要使用委托呢?正常的方式去调用类里另外一个方法不是一样么?
如果你要说可以多次new委托,达到复用?那么代码量没有减少,性能会有提升?

什么样的情况下我需要使用委托或者匿名方法?
拿eventhandler来说,我初步的理解它也就是一个参数是sender和e的方法
比如我这样的代码:

public void Init(HttpApplication application)
{
application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
application.EndRequest += (new EventHandler(this.Application_EndRequest));
}

// Your BeginRequest event handler.
private void Application_BeginRequest(Object source, EventArgs e)
{
//do something;
}

// Your EndRequest event handler.
private void Application_EndRequest(Object source, EventArgs e)
{
//do something;
}


我完全可以不那样写啊,我简单的写成如下形式不一样的意思吗?

public void Init(HttpApplication application)
{
application.BeginRequest += Application_BeginRequest();
application.EndRequest += Application_EndRequest();
}

// Your BeginRequest event handler.
private void Application_BeginRequest(Object source, EventArgs e)
{
//do something;
}

// Your EndRequest event handler.
private void Application_EndRequest(Object source, EventArgs e)
{
//do something;
}


上面的代码只是说明一下我的意思,不要深究里面的错误...我的意思就是说我完全可以在Init事件里去掉我要用的方法,而不使用委托。。。
所以回到这个问题
什么样的情况下我需要使用委托或者匿名方法?
...全文
1431 59 打赏 收藏 转发到动态 举报
写回复
用AI写文章
59 条回复
切换为时间正序
请发表友善的回复…
发表回复
jowu603 2012-03-20
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 wartim 的回复:]
委托可以简单看成是一个封装了的会自动增长和缩短的托管函数指针列表

C# code
->A
B
C
...

主要用在子线程操作主线程UI控件和作为回调函数
[/Quote]
按着这位高手的思路,我把4L说的牛奶报纸的代码再次读了读,这次明白了。
还得多使用才行。
濑户 2012-01-27
  • 打赏
  • 举报
回复 1
在现实中的实际情况下,我说的是现实中做一个项目,如果你写的代码是要给别人用的就会对委托有需求,假如所有代码都是自己来写就完全没有必要使用委托来调用,因为你自己都知道代码运行到哪应该调用什么方法,你写个委托完全是在浪费时间,感情

而如果你的代码写好之后还要继续给别人写,那委托,接口这些东西作用就出来了

如果想真实体会委托的用处,最好就是参与团队配合,或者你自己人格分裂,
ziyan688999 2010-05-11
  • 打赏
  • 举报
回复
顶一下
happy8888 2009-05-04
  • 打赏
  • 举报
回复
mark 谢谢楼主提出这么好的问题来讨论
jackieyd 2009-05-04
  • 打赏
  • 举报
回复
实现异步操作时使用委托和事件的。
与多线程编程中的异步方法原理一样,B在发送消息调用A提供的事件后,不必等待,可以接着处理自己的事情,等A的事件
结束后,将结果通过消息传递给B。
lsd123 2009-05-04
  • 打赏
  • 举报
回复
iamx7777777 2009-04-30
  • 打赏
  • 举报
回复
mark^
xiage 2009-04-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 vrhero 的回复:]
看来你完全没有理解委托...你的第二种写法只是Lambda的语法糖,叫做匿名委托...还是委托,换汤不换药...

委托是给其他调用者使用的,它的最大特点是调用者不知道什么时候该调用它,所以只好提前订阅它然后做自己的事不去管它...当委托对象有了订阅者感兴趣的消息就会通知调用者...这是方法不能很容易做到的...

想象一下订阅报纸或牛奶的过程...去看看Windows消息机制和事件驱动机制将有助于你理解委托...
[/Quote]
对,就应该用订阅来理解。
toothblue 2009-04-30
  • 打赏
  • 举报
回复
4楼说的对。后面的回复我都没有细看。
第一种和第二种写法全部都是在注册委托(使得事件与具体的实现关联)。
虽然没有写New EventHandler(),但是编译器已经能够自动识别函数的签名,然后发现与事件声明的委托签名相同,因此注册。
后面.net的匿名类型、隐式转换也有些类似,就是说,你无需指定类型的签名,编译器已经可以自动去正确推测了.
keke453042926 2009-04-29
  • 打赏
  • 举报
回复
当一个方法执行时,要通知其它的方法时,而要通知的方法的个数是不确定的时候,这就用到委托了。委托与事件是联系比较紧密的一般配合使用
所以学习委托也要学习事件。建议你看一下《大话设计模式》中的观察者模式。里面有详解。很不错的啊。
mmbf001 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 steven_007 的回复:]
找了个例子,一起学习:
重点是在调用的时候要实例化,指定这个delegate 要做什么事情。
delegate 参数知道结果是什么样的就等了。

这样做的话好处是
1.在执等的时候可指定给什么方法,代码比较好看,重用比较好。

比如我要有一个降XU,只要传一个委托参数,不用再写static public void SortJianXU


using System;
namespace BubbleSorter
{
delegate bool CompareOp(object lhs, object rhs);


[/Quote]
这个例子是C#高级编程上的...你的解释似乎说明不了什么问题...



...是不是我这样的想法是面向过程,而委托就可以随便写在什么地方,只要有访问权限,随时可以创建一个实例然后指向某个需要的方法,这样的话还是代码复用问题...求高手解答...
lsd123 2009-04-29
  • 打赏
  • 举报
回复
.
xufzu123 2009-04-29
  • 打赏
  • 举报
回复
可能是便于系统的封装吧,就像button的Click事件,我们通常写的都是事件的处理过程,还有很多代码是系统的~~
hm020 2009-04-29
  • 打赏
  • 举报
回复
一切归于基础.理解下委托机制就什么都知道了
编程有钱人了 2009-04-29
  • 打赏
  • 举报
回复

好帖,顶
timbs 2009-04-29
  • 打赏
  • 举报
回复
就好比你要租房子,又不认识有房子的人,你就需要找房介机构。这里房介机构就充当了委托的功能
LZ 好好再理解一下,应该就可以明白的
十八道胡同 2009-04-29
  • 打赏
  • 举报
回复
好帖,顶
A海阔天空 2009-04-29
  • 打赏
  • 举报
回复
学习..
jameney 2009-04-29
  • 打赏
  • 举报
回复
简单的来说,程序想回调的时候需要用到委托...
POWER_WONG 2009-04-29
  • 打赏
  • 举报
回复
学习下,强顶!
加载更多回复(38)

110,549

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧