委托事件
委托:
将方法作为参数传递:
相同点:委托的方法和定义的委托类型,他们的参数是相同的。
using System;
class Program
{
//定义委托类型
public delegate void EventHandler(string name);
private static void EnglishGreeting(string name)
{
Console.WriteLine("Morning," + name);
}
private static void ChineseGreeting(string name)
{
Console.WriteLine("早上好," + name);
}
//定义一个接收EventHandler类型的方法
private static void GreetPeople(string name, EventHandler OnEventOccurred)
{
OnEventOccurred(name);
}
static void Main(string[] args)
{
//将方法作为参数传递,并同时传递方法执行需要的参数
GreetPeople("jack", EnglishGreeting);
GreetPeople("杰克", ChineseGreeting);
Console.ReadKey();
}
}
运行结果:
handler += ChineseGreeting :
通过
+=
操作符,我们可以将多个方法绑定到同一个委托上,形成一个委托链。当调用这个委托时,所有绑定在该委托上的方法都会被依次执行。也可以通过-=消除委托对方法的绑定。
using System;
class Program
{
// 定义委托
public delegate void EventHandler(string name);
private static void EnglishGreeting(string name)
{
Console.WriteLine("Morning," + name);
}
private static void ChineseGreeting(string name)
{
Console.WriteLine("早上好," + name);
}
//定义一个接收GreetingDelegate类型的方法
//private static void GreetPeople(string name, EventHandler OnEventOccurred)
//{
// OnEventOccurred(name);
//}
static void Main(string[] args)
{
// 定义委托类型的变量
EventHandler handler;
// 将两个方法绑定到到委托上
handler = EnglishGreeting;
handler += ChineseGreeting;
handler("xiao zhang");
}
}
运行结果:
事件:
事件:从本质上将也是委托,只不过是进行了封装的委托。事件可以绑定方法,绑定之后就会监视这些方法,当达到事件的触发条件,就会执行事件绑定的方法
using System;
class Program
{
// 定义委托
public delegate void EventHandler(string name);
private static void EnglishGreeting(string name)
{
Console.WriteLine("Morning," + name);
}
private static void ChineseGreeting(string name)
{
Console.WriteLine("早上好," + name);
}
// 封装委托事件
public class Manager
{
// 声明事件
public event EventHandler OnEventOccurred;
// 触发事件的方法
public void GreetPeople(string name,bool tirFlag)
{
// 设置触发条件 如果为true,则不运行事件下的ChineseGreeting方法
if (tirFlag == true)
{
OnEventOccurred -= ChineseGreeting;
}
OnEventOccurred.Invoke(name);
}
}
static void Main(string[] args)
{
// 订阅事件
Manager manager = new Manager();
manager.OnEventOccurred += EnglishGreeting;
manager.OnEventOccurred += ChineseGreeting;
manager.GreetPeople("xiao zhang",true);
}
}
运行结果:
。。。。。。