黑马程序员技术交流社区
标题:
委托问题?
[打印本页]
作者:
全海波
时间:
2012-7-27 18:22
标题:
委托问题?
我搞不清委托问题,谁能给我举个例子,详细讲解一下委托的概念及应用,本人不胜感激!
作者:
王辉
时间:
2012-7-27 18:37
/*委托
委托是一种可以把引用存储为函数的类型,只有在介绍到事件和事件处理的时候才解释的清楚.委托的声明非常类型函数,但是不带函数体,而且要使用delegate,委托的声明指定了一个函数签名,其中包含一个返回类型和参数列表.定义了委托后就可以声明该委托类型的变量,接着把这个变量初始化为与委托有相同。
Delegate关键字指定该定义是用于委托的,而不是用于函数的, 委托和事件这两个概念是完全配合的。委托仅仅是函数指针,那就是说,它能够引用函数,通过传递地址的机制完成。委托是一个类,当你对它实例化时,要提供一个引用函数,将其作为它构造函数的参数.*/
namespace 委托
{
class MyDelegate
{
//double型的二元参数委托
//委托的声明非常类型函数,但是不带函数体,而且要使用delegate,委托的声明指定了一个函数签名;Delegate关键字指定该定义是用于委托的,而不是用于函数的
//委托仅仅是函数指针,它能够引用函数,通过传递地址的机制完成。委托是一个类,当你对它实例化时,要提供一个引用函数,将其作为它构造函数的参数
delegate double ProcessDelegate(double param1, double param2);//定义一个委托
static double Mult(double param1, double param2)
{
return param1 * param2;
}
static double Divide(double param1, double param2)
{
return param1 / param2;
}
static void Main(string[] args)
{
ProcessDelegate process;//定义委托成员变量
double param1 = 16, param2 = 4;
process = new ProcessDelegate(Mult);//实例化乘法委托
Console.WriteLine("ProcessDelegate(Mult);{0}", process(param1, param2));
process = new ProcessDelegate(Divide);//实例化除法委托
Console.WriteLine("ProcessDelegate(Divide);{0}", process(param1, param2));
Console.ReadKey();
}
}
}
作者:
马林康
时间:
2012-7-27 18:37
本帖最后由 马林康 于 2012-7-27 18:39 编辑
1.什么是委托,为什么要使用委托
我正在埋头苦写程序,突然想喝水,但是又不想自己去掉杯水而打断自己的思路,于是我就想让女朋友去给我倒水。她去给我倒水,首先我得让她知道我想让她干什么,通知她之后我可以继续写自己的程序,而倒水的工作就交给了她。这样的过程就相当于一个委托。
在程序过程中,当程序正在处理某个事件的时候,我需要另外的程序代码去辅助处理一些事情,于是委托另一个程序模块去处理,而委托就可以达到这种目的,我可以利用委托通知另外的程序模块,该去调用哪个函数方法。委托其实就起到了这样一个作用,将函数签名传递到了另一个函数中。
2.委托的定义
delegate int Add(int num1,int num2);
delegate void ConvertNum(string result);
上面是定义两个委托的例子,其实很简单。声明一个委托使用delegate关键字,上面分别是定义的带返回值的委托和不带返回值的委托,
两个委托都有传递参数,当然也可以不传递参数。其实委托也是一个类,委托派生为System.MulticastDelegate,而System.MulticastDelegate
又继承System.Delegate,如果你知道这个也就明白委托其实是一个特殊的类。
委托的简单实用例子
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 public delegate string TeaDelegate(string spText);
public class DelegateSource
{
public void TestDelegate()
{
Operator op = new Operator();
TeaDelegate tea = new TeaDelegate(op.GetTea);
Console.WriteLine("去给我倒杯水");
Console.WriteLine();
string result=tea("去给我倒杯水");
Thread.Sleep(5000);
Console.WriteLine(result);
Console.WriteLine();
}
}
public class Operator
{
/// <summary>
/// 确定是否还有水
/// </summary>
private bool flag = true;
public string GetTea(string spText)
{
if (spText == "去给我倒杯水")
{
if (flag)
{
return "老公,茶来了";
}
else
{
return "老公,没有水了";
}
}
return "等待.......";
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2