委托(delegate),我就是不明白为什么要使用!我里面的这个程序不用委托就死人了啊?给我一个用委托的理由。

wyanshan 2009-01-02 11:24:00
下面的程序可以不适用委托,直接调用类的方法就可以了。我知道这是举例子。但是,一般来说,为什么要使用委托呢?不适用委托,照样可以完成任务啊?比如下面的程序。谁解释一下,大白话最好。
using System;

class clsDelegate
{
public delegate int simpleDelegate (int a, int b);
public int addNumber(int a, int b)
{
return (a+b);
}

public int mulNumber(int a, int b)
{
return (a*b);
}

static void Main(string[] args)
{
clsDelegate clsDlg = new clsDelegate();
simpleDelegate addDelegate = new simpleDelegate(clsDlg.addNumber);
simpleDelegate mulDelegate = new simpleDelegate(clsDlg.mulNumber);
int addAns = addDelegate(10,12);
int mulAns = mulDelegate(10,10);
Console.WriteLine("Result by calling the addNum method using a delegate: {0}",addAns);
Console.WriteLine("Result by calling the mulNum method using a delegate: {0}",mulAns);
Console.Read();
}
}
...全文
1155 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
白头老汉 2010-01-17
  • 打赏
  • 举报
回复
把invoke放在更新的方法内,就不用把控件作为参数传给别的类了
shuidao 2009-01-03
  • 打赏
  • 举报
回复
如楼主所说,有些地方可以直接调用对象的方法,而不用委托。
但有些时候这样做不合适。
比如,在写这个类的时候,根本就不能确定要调用哪个对象的方法:例如,你把自己的一个对象上的方法挂在微软的textbox 的一个事件上。微软在写textbox时根本就不可能知道这个事件发生时,需要调用哪个对象的哪个方法,只有你自己去指定说需要调什么方法,并且以委托的方式挂在相应的事件上。

微软在写textbox的事件时,唯一能确定的是这个事件的格式,或者说这个事件需要调用的方法的格式,
类似于 button1_click(object sender, EnentArgs e) 等等。 只要是按照这个类型写的方法,都能被挂在这个事件上,并且在事件发生时,方法会被调用。

而规定了事件方法格式,就确保了事件发生时被调用的方法都是合法的,不会出现方法类型不匹配等等。这就是所谓的委托是类型安全的。而c++下面用void* 的函数指针实现事件处理缺少对函数格式的检查。 所以C# 发明了委托这个怪东西,为的就是然被调用的函数格式正确。


这只是基于消息驱动的实现方式之一。

另一个普遍的方式,是使用接口。这是java的事件处理方式。 它以接口的形式规定了被调用方法的格式。这种方式更直接,更简单,更容易理解。

两种方式各有利弊,有各自的使用场景,但从效果上看是等效的。
javakiki 2009-01-03
  • 打赏
  • 举报
回复
C#里面的委托就是你定义了一个委托类型的变量
=====================================
你说的是event吧..通俗的讲,委托可以看看做一个类,而事件可以看做委托的一个实例.只是开个比方,呵呵
javakiki 2009-01-03
  • 打赏
  • 举报
回复
你想知道委托有什么用?我就出个题目你做
winform窗体,父窗体和子窗体,都有TextBox空间,实现下面功能:
在子窗体中的textBox中输入字符,父窗体的textbox中能实时的也出同样的字符.
king19840811 2009-01-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cuike519 的回复:]
如果你知道为什么要用接口,那么也就知道为什么要用委托。


如果你不知道为什么要用接口,通俗的说就是你在写一个类的时候,这个类要完成一件事情,但是你有不知道这件事情该怎么完成,你只知道要完成这件事情(也就是说你知道这件事情的签名或者叫接口),只有这个类在运行的时候调用方知道怎么完成这件事情,这时候你用一个委托来告诉调用方,这时候要完成一件事情,至于事情怎么完成则有调用方通过委托或者接口来完成。。…
[/Quote]

有理
highfly2008 2009-01-03
  • 打赏
  • 举报
回复
7楼讲的好
cuike519 2009-01-03
  • 打赏
  • 举报
回复
如果你知道为什么要用接口,那么也就知道为什么要用委托。


如果你不知道为什么要用接口,通俗的说就是你在写一个类的时候,这个类要完成一件事情,但是你有不知道这件事情该怎么完成,你只知道要完成这件事情(也就是说你知道这件事情的签名或者叫接口),只有这个类在运行的时候调用方知道怎么完成这件事情,这时候你用一个委托来告诉调用方,这时候要完成一件事情,至于事情怎么完成则有调用方通过委托或者接口来完成。。。
Ki1381 2009-01-03
  • 打赏
  • 举报
回复
想象一下如果把你“用嘴吃东西的过程”封装成一个类吧:

其中对于吃这个动作是这么定义的:

public void 吃(食物)
{

把食物塞你嘴里(); // step 1

嘴开始有所动作(食物); // step 2

咽下去(是否可以咽下去); // step 3
}

注意步骤二,不同的食物你的嘴会采用不同的方式处理。

当食物==水,不会咀嚼直接咽
当食物==肉包子,当然要嚼嚼再咽
当食物==口香糖,只嚼不咽
当食物==鱼,你还要仔细的吐出鱼刺......


显然你不可能在你的类里预见到所有情形,这种情况下就可以把“嘴开始有所动作”考虑定义成委托,让客户端调用时给出具体实现,至于在类里,占个位而已。







ChrisAK 2009-01-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 CsToD 的回复:]
7楼给你说的是事件,我直接给你举个委托的例子。
现在我要对一系列数据进行排序,而排序算法可能比较复杂,我不会自己写,我想调用Array.Sort方法,微软为我们提供了快速排序算法。
但是这里有一个问题——我要实现自定义排序规则,比如对于字符串,默认的是按字母顺序,但现在我想这样排序:

按字符串长度排序,只有当长度不同时,再按字母排序。

显然,微软不可能提供这样“个性”的排序方法,那是不是说,就必须让…
[/Quote]也不是解决不了,定义一个接口,然后你自己继承那个接口写一个类,在接口函数里把排序规则写好.
然后给它传个类实例,排序内部把那个实例当接口处理就可以了,java就是这样解决的.
不过...
很显然.对于新写一个类来说我更愿意使用委托一条函数解决问题.新写一个类我要多敲多少次键盘呐...
而且在C#3.0里我连新函数都懒得写,一个Lambda表达式搞定
CsToD 2009-01-03
  • 打赏
  • 举报
回复
7楼给你说的是事件,我直接给你举个委托的例子。
现在我要对一系列数据进行排序,而排序算法可能比较复杂,我不会自己写,我想调用Array.Sort方法,微软为我们提供了快速排序算法。
但是这里有一个问题——我要实现自定义排序规则,比如对于字符串,默认的是按字母顺序,但现在我想这样排序:

按字符串长度排序,只有当长度不同时,再按字母排序。

显然,微软不可能提供这样“个性”的排序方法,那是不是说,就必须让我们自己去写快速排序算法呢?
不需要!
我们只需要使用委托,就能实现这个要求:
string[]strs="I like C# very much".Split();
Array.Sort(strs,Rule);
int void Rule(string first,string second)
{
return first.Length==second.Length?first.CompareTo(second):first.Length.CompareTo(second.Length);
}

显然,我并不需要知道快速排序算法的逻辑,我只需要告之排序规则,就实现了我的个性排序。

试问:如果没有委托,你如何解决这个问题?
wyanshan 2009-01-02
  • 打赏
  • 举报
回复
我今天第一天学习委托delegate.有一点小小的感想。请看,不管对不对。哈哈。
2009年1月2日,我开始学习c#中的委托。我喜欢说大白话,更喜欢使用大白话让不懂的人看了一定可以看懂。就像我现在正在说大白话一样。好了,继续:
首先,我告诉跟我一样的初学者,delegate这个单词的意思,是委派、委托的意思。可以去google查嘛!那什么是委托呢?跟你说吧!就是领导让某个人干一大堆的事儿!我是领导,你是科员,我跟你说了,让你干这些事情:
1,擦黑板去!
2,拖地去!
3,接我儿子放学回来并送到我办公室!
那C#里面的委托是啥意思呢?据我了解,C#里面的委托就是你定义了一个委托类型的变量,你让这个变量做大一堆事!至于做什么事儿,慢慢再说。反正让这个变量做事情,否则生你干嘛!生你,就是让你干活呢!
其实啊,上面三件事情,确实可以使用类的方法一个一个执行。但是,如果三个参数比较类似,那么只要声明一个delegate对象,并且让这个delegate指向这三个方法,就可以完全自动执行。
已经写在我的博客里面啦。大家看看我理解是否正确啊?
ywtywt337 2009-01-02
  • 打赏
  • 举报
回复
我是这样理解委托的:方法可以带参数,这个参数又是一个方法。
卧_槽 2009-01-02
  • 打赏
  • 举报
回复
不怕还没到要用的时候,觉得么啥用。

就怕到了要用的时候,不知道有这么个东西。

110,618

社区成员

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

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

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