黑马程序员技术交流社区
标题:
关于委托
[打印本页]
作者:
罗代势
时间:
2012-11-1 18:10
标题:
关于委托
本帖最后由 罗代势 于 2012-11-24 13:59 编辑
谁能跟我讲讲委托delegate
作者:
李行周
时间:
2012-11-2 21:26
首先你要明白,现实生活中的委托也就是中介是什么意思!用一个人关于买书买饭的例子,来给你说一下。
首先我们假设要买书,但我们是通过书店或者网上,这个书店网上就相当于一个委托也就是中介。我们要通过买书的时候首先这个中介得存在(也就是1.定义一个Delegate函数数据结构),中介有了我们得知道中介是可以用来做那些事情的(定义Delegate将引用的静态方法或引用类实例及该类的实例方法),然后我们得找到这个能替我们解决问题的中介(3.Delegate数据变量指向实例方法),最后中介接到我们的问题之后就调用他们内部的渠道去解决问题(4.通过Delegate数据变量执行实例方法)而这整个过程做为调用方,委托的方法对我们来说是看不到的,我们不知道中介接到我们的问题之后,会执行那些方法去替我们解决问题。下面是我写的一个简单的例子:
namespace 委托
{
public delegate void MaiFan(String Name,String res);
public delegate void MaiShu(String Name, String res);//1.定义一个委托数据结构
class Program
{
public static void MiFan(String Name, String res)//2.定义Delegate将引用的静态方法或引用类实例及该类的实例方法
{
Console.WriteLine("hello!{0}你要买的是{1},已经好了",Name,res);
}
public static void XiFan(String Name, String res)//创建要委托的静态方法
{
Console.WriteLine("hello!{0}你要买的是{1}已经好了", Name, res);
}
public static void JiaoZi(String Name, String res)//创建要委托的静态方法
{
Console.WriteLine("hello!{0}你要买的是{1},已经好了", Name, res);
}
public static void YuWen(String Name, String res)//创建要委托的静态方法
{
Console.WriteLine("hello!{0}你要买的是{1},已经好了", Name, res);
}
public static void ShuXUe(String Name, String res)//创建要委托的静态方法
{
Console.WriteLine("hello!{0}你要买的是{1},已经好了", Name, res);
}
public static void WuLi(String Name, String res)//创建要委托的静态方法
{
Console.WriteLine("hello!{0}你要买的是{1},已经好了", Name, res);
}
static void Main(string[] args)
{
MaiFan MF = null;
MaiShu MS = null;
while (true)
{
Console.WriteLine("你要买书,还是买饭!请选1买饭,选2买书");
int num = Convert.ToInt16(Console.ReadLine());
if (num == 1)
{
Console.WriteLine("你好!请输入你的名字!");
string name = Console.ReadLine();
Console.WriteLine("请选择你要买饭的序号!米饭(1)希饭(2)饺子(3)");
int nu = Convert.ToInt16(Console.ReadLine());
switch (nu)
{
case 1:
MF = MiFan;//3.Delegate委托数据变量指向实例方法
MF(name,"自动生成的米饭");//4执行委托实例方法
break;
case 2:
MF = XiFan;
MF(name, "自动生成的希饭");
break;
case 3:
MF = XiFan;
MF(name, "自动生成的饺子");
break;
default: break;
}
}
else
{
if (num == 2)
{
Console.WriteLine("你好!请输入你的名字!");
string name = Console.ReadLine();
Console.WriteLine("请选择你要买书的类型!语文(1)数学(2)物理(3)");
int nu = Convert.ToInt16(Console.ReadLine());
switch (nu)
{
case 1:
MS =YuWen;
MS(name, "自动生成的语文");
break;
case 2:
MS = ShuXUe;
MS(name, "自动生成的数学");
break;
case 3:
MS = WuLi;
MS(name, "自动生成的物理");
break;
default: break;
}
}
else
{
Console.WriteLine("您的选择不正确!");
}
}
}
}
}
}
复制代码
作者:
380933512
时间:
2012-11-3 16:27
MSDN:
委托是一个类型,是一个定义签名的类型,即方法的返回值类型和参数列表类型。可以使用委托类型来声明一个变量,该变量可以引用与委托签名相同的所有方法。
委托仅仅是函数指针,那就是说,它能够引用函数。
那么,定义一个委托,也就等于定义一个函数指针,
那么,函数指针指向一些什么样的函数呢?
这就在定义委托的时候决定了,如:
public delegate void ShowDelegate(int p);
这就定义了一个委托 ShowDelegate。他指向的函数的返回类型为:void,函数有 1 个参数,类型为 int 型。
委托可以用来调用函数,如:
ShowDelegate abc = new ShowDelegate(ShowHi);
abc(15);
也可以做为函数的参数。
但大多数委托的用途多用于事件上。
事件就是委托的实例:
public event 委托名(xxxEventHandler) 事件名/实例名;
详细请看:
http://www.cnblogs.com/finesite/articles/255884.html
using System;
public class TestDelegate
{
public delegate void ShowDelegate(int p);
public static void ShowHi(int a)
{
Console.Write("Hi:{0}\n", a);
}
public static void ShowHello(int b)
{
Console.Write("Hello:{0}\n", b);
}
public static void HowShow(ShowDelegate pr)
{
int a = 10;
pr(a);
}
public static void Main()
{
HowShow(new ShowDelegate(ShowHello));
ShowDelegate abc = new ShowDelegate(ShowHi);
abc(15);
}
}
复制代码
作者:
罗代势
时间:
2012-11-3 19:58
谢谢!!!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2