给楼主个例子吧using System; namespace DelegateExample { //第一步:声明委托 public delegate string MyDelegate(string name); public class Program { //第二步:定义被调用的方法 public static string FunctionA(string name) { return "A say Hello to " + name; } public static string FunctionB(string name) { return "B say Hello to " + name; } //第三步:定义delegate类型的处理函数,并在此函数中 //通过delegate类型调用步骤定义的方法 public static void MethodA(MyDelegate Me) { Console.WriteLine(Me("张三")); } public static void Main() { //第四步:创建实例,传入准备调用的方法名 MyDelegate a = new MyDelegate(FunctionA); MyDelegate b = new MyDelegate(FunctionB); MethodA(a); MethodA(b); Console.ReadLine(); } } }
具体例子网上很多
.Net 委托
event强调了事件。通过订阅事件来获得通知
delegate则泛指符合某种格式的函数
EventHandler 是一个预定义的委托。
典型的是看观察着模式。
个人认为这个需要写代码实际体验下,
真正晓得了委托带来的好处后就知道它为何物了,
不必为概念所束缚。
几种食材: 多个方法,最少一个
一个煎饼果子: 委托吃煎饼: 调用委托
一起吃了几种食物: 实际执行了多个方法这只是委托的最简单应用,最浅显理解,如果你懂了,那你可以学习委托的高级应用,
如异步委托,事件等我有个经验就是,理解事件的时候,通过开发winform程序可以很容易理解
1. 语法直截了当。程序员只需要简单些一个变量声明,声明一个事件或者委托。而不需要额外写一个class。比如我们一旦看到继承了 INotifyPropertyChange 接口对象都知道它干什么事情,非常清晰。
2. 委托(或者事件)的定义是在服务上声明的,而根本不依赖于客户。(你可能会看到一些所谓模式的代码,其被观察者竟然依赖观察者,要小心了)
委托用来表示一个方法,不同的委托,区别就在方法的参数类型和数量。
支持范型以后,.net4的类库已经定义了支持十几个不同参数和返回值的委托fun和action了,所以基本上就不用自己定义这种类型,直接使用就可以了。
使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的。
比如说一个公司(场景),你是老板,手下有两个员工,小张和小王。
你命令小王,如果小张玩游戏,则小王扣去小张500元钱。
这就是现实中的委托。
实际上,在写程序中,程序员就是老板,小张和小王就是两个对象。小张玩游戏是一个方法,小张还有一个游戏事件,他玩游戏激发这个事件。而小王就是事件处理对象,他负责把小张的钱扣除500。
所以,委托有如下几个要素:
1 激发事件的对象--就是小张
2 处理对象事件的对象--就是小王
3 定义委托,就是你让小王监视小张。
如果这三个要素都满足的话,则你就写出了一个完整事件的处理。
下面有个例子:在vs.net2003 C#控制台应用程序编辑运行成功:
using System;
namespace CSharpConsole
{
public class 场景
{
[STAThread]
public static void Main(string[] args)
{
Console.WriteLine("场景开始了....");
// 生成小王
小王 w = new 小王();
// 生成小账
小张 z = new 小张();
// 指定监视
z.PlayGame += new PlayGameHandler(w.扣钱);
// 开始玩游戏
z.玩游戏();
console.writeline("场景结束...");
Console.ReadLine();
}
} // 负责扣钱的人
public class 小王
{
public 小王()
{
Console.WriteLine("生成小王...");
}
public void 扣钱(object sender,EventArgs e)
{
Console.WriteLine("小王:好小子,上班时间胆敢玩游戏...");
Console.WriteLine("小王:看看你小子有多少钱...");
小张 f = (小张)sender;
Console.WriteLine("小张的钱: " + f.钱.ToString());
Console.WriteLine("开始扣钱......");
System.Threading.Thread.Sleep(500);
f.钱 = f.钱 - 500;
Console.WriteLine("扣完了....现在小张还剩下:" + f.钱.ToString());
}
}
// 如果玩游戏,则引发事件
public class 小张
{
// 先定义一个事件,这个事件表示“小张”在玩游戏。
public event PlayGameHandler PlayGame;
// 保存小张钱的变量
private int m_Money;
public 小张()
{
Console.WriteLine("生成小张....");
m_Money = 1000; // 构造函数,初始化小张的钱。
}
public int 钱 // 此属性可以操作小张的钱。
{
get
{
return m_Money;
}
set
{
m_Money = value;
}
}
public void 玩游戏()
{
Console.WriteLine("小张开始玩游戏了.....");
Console.WriteLine("小张:CS好玩,哈哈哈! 我玩.....");
System.Threading.Thread.Sleep(500);
System.EventArgs e = new EventArgs();
OnPlayGame(e);
}
protected virtual voidonPlayGame(EventArgs e)
{
if(PlayGame != null)
{
PlayGame(this,e);
}
}
}
// 定义委托处理程序
public delegate void PlayGameHandler(object sender,System.EventArgs e); public delegate void PlayGameHandler(object sender,System.EventArgs e); //定义委托处理程序
public delegate void PlayGameHandler(object sender,System.EventArgs e); OnPlayGame(e); "小张开始玩游戏了"
}
委托的最大特点是:它不知道或不关心自己引用的对 象的类。
委托的应用:回调(CallBack)机制、事件处理。
委托的声明和使用
例如:
public delegate void FuncDelegate(string str);
namespace DelegateExample
{
//第一步:声明委托
public delegate string MyDelegate(string name);
public class Program
{
//第二步:定义被调用的方法
public static string FunctionA(string name)
{
return "A say Hello to " + name;
}
public static string FunctionB(string name)
{
return "B say Hello to " + name;
}
//第三步:定义delegate类型的处理函数,并在此函数中
//通过delegate类型调用步骤定义的方法
public static void MethodA(MyDelegate Me)
{
Console.WriteLine(Me("张三"));
}
public static void Main()
{
//第四步:创建实例,传入准备调用的方法名
MyDelegate a = new MyDelegate(FunctionA);
MyDelegate b = new MyDelegate(FunctionB);
MethodA(a);
MethodA(b);
Console.ReadLine();
}
}
}