using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace _11
{
public class Hello
{
///
/// 定义好事件的委托
///
public delegate void ShowHIDelegate();
///
/// 定义好一个你好的事件
///
public event ShowHIDelegate ShowHievent;
public void ClickShowHievent()
{
if (ShowHievent != null)
{
//执行问好的方法
ShowHievent();
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace _11
{
///
/// 日本人
///
public class Jp
{
public void ShowHi()
{
Console.WriteLine(“日本人:你好”);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace _11
{
///
/// 美国人
///
public class USA
{
public void ShowHi()
{
Console.WriteLine(“美国人:你好”);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace _11
{
class Program
{
///
/// 可以将方法作为参数传递的特殊的引用类型变量
/// 实现方法的模板->抽象类 接口 (针对于方法)
/// 实现委托的方法必须和委托定义的一模一样
///
//delegate void ShowHi(string str);
static void Main(string[] args)
{
//ShowHi sh = new ShowHi(ShowHi2);
//sh(“zs”);
//加事件+= 减事件-=
//实际上事件的运行的规则和过程与委托一致
//事件最终执行的内容依然是委托
//事件和委托的关联是因为
//在定义事件的时候就会有一个委托的定义
//并且事件的类型 就是当前的委托
//1需要实例化你的发布器
Hello h = new Hello();
//2需要实例化你的订阅器
Jp j = new Jp();
USA u = new USA();
//3给发布器加上订阅器
h.ShowHievent += new Hello.ShowHIDelegate(j.ShowHi);
h.ShowHievent += new Hello.ShowHIDelegate(u.ShowHi);
//4给发布器去除订阅器
h.ShowHievent -= new Hello.ShowHIDelegate(u.ShowHi);
//5执行事件
h.ClickShowHievent();
Console.ReadKey();
Console.ReadKey();
}
//public static void ShowHi2(string str)
//{
// Console.WriteLine("你好" + str);
//}
}
}
以上是委托的和事件的简单案例。反射在很多高级语言都有介绍,大都大同小异。
委托就是第三方,调用者告诉第三方要做什么,然后调用者就不用管了 这个委托(第三方)就会去调用方法去帮你实现
委托的好处: 1.相当于用方法作为另一方法参数(类似于C的函数指针)
2.在两个不能直接调用的方法中作为桥梁,如:在多线程中的跨线程的方法调用就得用委托
3.当不知道方法具体实现什么时使用委托,如:事件中使用委托