关于C#中delegate委托,到底有何好处,举个例子说说吧

Kenzson 2014-04-04 04:40:01
看了半天的有关委托方面的知识,可还是一知半解。还有这句话是何含义?
“如果要引发事件,类可以调用委托,并传递所有与事件有关的参数。”
举个例子最好啦
...全文
16754 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
所长别开枪 2015-08-07
  • 打赏
  • 举报
回复
事件委托的好处是,别人给你开放入口,具体实现自己定义。
  • 打赏
  • 举报
回复
软件设计概念需要学习很多年。很好地运用事件,对于学生来说,需要有一两年实践经验,并且受命开发一些组件。 有些工作了5、6年的开发人员,你让他开发一个非常简单的只有几十行的组件,你告诉他“你需要先设计一下啊,要有个文档,考虑到以后发布给同事们使用时”,他也许会说“我来公司是来写程序的,不是来搞设计的”。这种程序猿就只好辞退的。 实际上有经验的程序员就应该是来搞这类组件设计和重构的,而不是来“仅仅会用别人的组件”的。
  • 打赏
  • 举报
回复
例如你受命开发一个组件(不管是silverlight的用户控件,还是asp.net的用户控件,或者是jQuery的插件,等等不管哪一种都一样的思路),假设我告诉你三个参数“数据库表、关键字段的名称、关键字段的值”,要求你做的这个用户控件就能自动从数据库中读取出数据记录来,并且在页面上直接产生一个标准化的“增删改查”表单。你如何发布给别人组合到他们的程序中广泛使用? 你需要在接口上设计几个参数、几个属性、十几个事件,这样才能方便与发布给别人使用。而且.net软件工程师都习惯于研究你的事件触发机制和事件参数。 因此事件驱动程序设计,是软件设计的基础概念。
  • 打赏
  • 举报
回复
作为一个设计原则,设计师不会在“两个工程阶段”之间设计相互纠结的所谓接口。 例如你使用的成千上万种控件,例如TextBox吧,它可以暴露出TextChanged事件、KeyDown、KeyPress事件等等,你捕获这这些事件就可以交互控制TextBox,例如让用户按Enter键时实际上程序收到的是Tab键,或者例如当文本最终确认改变时你当即将录入数字更新到界面上的“汇总”区域中。 显然,TextBox是在几十年前(1993年以前)就设计好的,只不过在2002年在.net上又实现了一遍而已。它不用知道你的客户程序的接口,就能跟你的程序交互操作。这一切依赖于这种“依赖倒置”的设计模式,也就是让你的程序中的各个文本框的的良好运作功能不用基于你的程序接口来设计,而是基于人家TextBox上的事件接口规范来设计即可。 在你的程序中很好地设计事件,是一个“代码民工”成长为“程序设计师”的最起码的指标之一。正是因为这些需要一点头脑的设计概念,才把程序猿从只会抄写、拼凑代码的习惯中解放出来,使得程序员花同样的时间(或者稍微长一点的时间)但是可以设计出更强大10倍、更长久10倍的软件。
liulinisgood 2014-04-06
  • 打赏
  • 举报
回复
其实简单的说 委托和事件是相互协作的 为什么要委托 有些接口是在框架中写好,起到通知作用,具体的事件内容在委托中定义即可,即客户端实现
Coffcer 2014-04-05
  • 打赏
  • 举报
回复
只知道是把方法当参数用的,JS里遍地都是
indusl 2014-04-05
  • 打赏
  • 举报
回复
尼玛,我还是学过C++的,知道函数指针是什么,但至少用了3年才真正理解委托、事件到底是什么玩意。上面已经说了很多,但你也只能理解个大概(实际上委托是个简单的东西,但如果你不用,不了解实际用法,永远无法真正理解这个东西) 你去看.net源码吧,里面大量委托,事件的应用实例,边看边想,最后你就明白了
万载馨辰 2014-04-05
  • 打赏
  • 举报
回复
一句话,楼主码的代码不够多 码的代码够多了,实现的功能够强了,希望封装框架了,不用别人说就能知道
ErrorErro 2014-04-05
  • 打赏
  • 举报
回复
可以当作变量来传递,可以放到数组里,还可以异步调用 多播委托可以调用多个方法 委托的协变性和逆变性能简化变成
tcmakebest 2014-04-04
  • 打赏
  • 举报
回复
当必须要用到委托的时候,自然就会很容易理解了,先把其他基础知识学好吧。
insus 2014-04-04
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
引用 楼主 awajwgluiawa 的回复:
“如果要引发事件,类可以调用委托,并传递所有与事件有关的参数。”
这个翻译很糟糕,中文不通。
threenewbee 2014-04-04
  • 打赏
  • 举报
回复
似乎没有什么“好处”。如果你觉得学得费劲,不学拉倒。
minhua1983 2014-04-04
  • 打赏
  • 举报
回复
就像那2楼说的,通过理解Button.Click事件的整个过程就会明白委托和事件了,不过得看下自定义控件,页面生命周期,回发,观察者模式,假以时日,委托和事件也就会一点点明白了。 ASP.NET WEBFORM中很多用到事件的地方,看看还是有帮助的。 很多ASP.NET程序员,觉得拖控件被人家看不起,还没弄懂委托和事件,就直接转MVC,有点可惜了。
minhua1983 2014-04-04
  • 打赏
  • 举报
回复
我的理解如下: 委托就是对一个方法映射,把方法名当参数来传递,类似JS中的在某个function的参数中把另一个function的名称当参数来传递。 //定义委托原型 delegate void UpdateHandler(int id); //定义符合委托原型的方法UpdateMember void UpdateMember(int id) { //更新用户逻辑 } //定义符合委托原型的方法DeleteMember void DeleteMember(int id) { //删除用户逻辑 } 如何使用呢,如下: //实例化委托对象,再构造函数中把方法名当参数来传递。 UpdateHandler handler = new UpdateHandler(UpdateMember); //执行委托对象 handler(某个用户id); handler(某个用户id)就等价于 UpdateMember(某个用户id) 也可以连接多个相同签名的方法,组成一个委托链,当调用委托对象时,链上的方法,按映射的顺序一次被执行。 如何使用呢,如下: UpdateHandler handler = new UpdateHandler(UpdateMember); handler += DeleteMember; handler(某个用户id); handler(某个用户id)就等价于 UpdateMember(某个用户id) DeleteMember(某个用户id) 事件的话,看看设计模式中的观察者模式。 被观察对象中维护了一个观察者列表,这些观察者会对被观察者某个“动作”,即事件,做出各自不同的反映。 常见的例子如下: 某一场景下有主人,猫,狗3个对象。 当主人“打开门”后,猫“跑开了”,狗“叫了”。 整个过程中,主人就是被观察对象,猫和狗都是观察者。 一旦主人触发“打开门”这个事件的话,猫狗做出不同的反映,猫“跑开了”,狗“叫了”。 代码如下: public class Host { //定义委托原型 public delegate void OpenDoorEventHandler(); //定义委托类型的事件 public event GoHomeEventHandler OpenDoor; //定义内部一个方法,在这个方法内判断,OpenDoor事件是否被其他对象注册,一旦注册了,则调用执行事件。 protected void OnOpenDoor() { if(OpenDoor!=null) { OpenDoor(); } } public void GoHome() { OnOpenDoor(); } } public class Cat { public void Run() { //猫跑了 } } public class Dog { public void Bark() { //狗叫了 } } 如何使用如下: Host 主人 =new Host(); Cat 猫 = new Cat(); Dog 狗 = new Dog(); 主人.OpenDoor += new 主人.OpenDoorEventHandler(猫.Run); 主人.OpenDoor += new 主人.OpenDoorEventHandler(狗.Back); 主人.GoHome就等价于 猫.Run(); 狗.Back(); 当被观察者,做出某一特定“动作”(被观察者的特定“动作”,注册了N个不同对象的不同反映),观察者对这个特定“动作”做出不懂的反映。
Kenzson 2014-04-04
  • 打赏
  • 举报
回复
引用 10 楼 vb763305825 的回复:
        public Form1()
        {
            InitializeComponent();

            //如果要引发Click事件,可以调用EventHandler委托,并传递所有与事件有关的参数(sender,e)。
            this.Click += new EventHandler(Form1_Click);
        }

        void Form1_Click(object sender, EventArgs e)
        {
            throw new NotImplementedException();
        }    
我说的是delegate这个关键字
  • 打赏
  • 举报
回复
        public Form1()
        {
            InitializeComponent();

            //如果要引发Click事件,可以调用EventHandler委托,并传递所有与事件有关的参数(sender,e)。
            this.Click += new EventHandler(Form1_Click);
        }

        void Form1_Click(object sender, EventArgs e)
        {
            throw new NotImplementedException();
        }    
Kenzson 2014-04-04
  • 打赏
  • 举报
回复
引用 7 楼 starfd 的回复:
自动微软提供了Action和Fun。。。其实基本上已经没必要自己写委托了
什么意思?智能化生成?
Kenzson 2014-04-04
  • 打赏
  • 举报
回复
引用 5 楼 wei_hang 的回复:
1. C#的委托等同于C++的函数指针 。可以 从 C++函数指针反过来理解C#委托。 2. 委托应用于“同步调用”的场景,如一个有声阅读器,打开记事本(1)并开始阅读(2),这是两个方法,但这时,我想 调用打开的方法时,同时调阅读,这时候委托就来了,把阅读这个方法作为参数传给“打开记事本”的方法。
2. 与一般的用法有什么区别, reader.open(); reader.read(); 顺序执行不是一样的吗?
  • 打赏
  • 举报
回复
自动微软提供了Action和Fun。。。其实基本上已经没必要自己写委托了
加载更多回复(6)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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