日期:2014-05-18  浏览次数:20707 次

委托(delegate),我就是不明白为什么要使用!我里面的这个程序不用委托就死人了啊?给我一个用委托的理由。
下面的程序可以不适用委托,直接调用类的方法就可以了。我知道这是举例子。但是,一般来说,为什么要使用委托呢?不适用委托,照样可以完成任务啊?比如下面的程序。谁解释一下,大白话最好。
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();
}
}

------解决方案--------------------
你想知道委托有什么用?我就出个题目你做
winform窗体,父窗体和子窗体,都有TextBox空间,实现下面功能:
在子窗体中的textBox中输入字符,父窗体的textbox中能实时的也出同样的字符.
------解决方案--------------------
C#里面的委托就是你定义了一个委托类型的变量
=====================================
你说的是event吧..通俗的讲,委托可以看看做一个类,而事件可以看做委托的一个实例.只是开个比方,呵呵
------解决方案--------------------
如楼主所说,有些地方可以直接调用对象的方法,而不用委托。
但有些时候这样做不合适。
比如,在写这个类的时候,根本就不能确定要调用哪个对象的方法:例如,你把自己的一个对象上的方法挂在微软的textbox 的一个事件上。微软在写textbox时根本就不可能知道这个事件发生时,需要调用哪个对象的哪个方法,只有你自己去指定说需要调什么方法,并且以委托的方式挂在相应的事件上。

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

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


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

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

两种方式各有利弊,有各自的使用场景,但从效果上看是等效的。
------解决方案--------------------
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);
}

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

试问:如果没有委托,你如何解决这个问题?

------解决方案--------------------
想象一下如果把你“用嘴吃东西的过程”封装成一个类吧:

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

public void 吃(食物)
{

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

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

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

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

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


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