1.定义事件的语法:<访问修饰符> event 委托名 事件名;
2.订阅事件的语法:事件名+=new 委托名(方法名);
3.定义好事件后,与事件有关的人会订阅事件,只有订阅事件的对象才会收到发生事件的通知,没有订阅该事件的对象则不会收到通知;
4.事件的订阅通过“+=”操作符来实现,可以给事件加一个或多个方法委托;
5.奥运会参加百米的田径运动员听到枪声,比赛立即进行。其中枪声是事件,而运动员比赛就是这个事件发生后的动作。不参加该项比赛的人对枪声没有反应。从程序员的角度分析,当裁判员枪声响起,发生了一个事件,裁判员通知该事件发生,参加比赛的运动员仔细听枪声是否发生。运动员是该事件的订阅者,没有参赛的人不会注意,即没有订阅该事件。
6.事件是一种特殊的委托,或者说是受限制的委托。事件只能在类内部调用,不能在外部调用;而委托在类内,外部都有可以调用
例1:
namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
Judgement judgement = new Judgement();
RunSports runSports = new RunSports();
runSports.d += judgement.Run;
runSports.Begin();
Console.ReadKey();
}
}
public class Judgement //裁判
{
public void Run()
{
Console.WriteLine("运动员开始比赛");
}
}
public class RunSports //运动员
{
public delegate void del();
public event del d;
public void Begin()
{
d();
}
}
}
=》
例二:
public delegate void HelloWorldDelegate(string name);
public class HelloWorldClass
{
public event HelloWorldDelegate del;
public void HelloWorld(string name)
{
del(name); //委托调用所有注册的方法
}
}
class Program
{
private static void ByEnglish(string name)
{
Console.WriteLine("Hello World By" + name);
}
private static void ByChinese(string name)
{
Console.WriteLine("你好" + name);
}
static void Main(string[] args)
{
HelloWorldClass hw = new HelloWorldClass();
//hw.del = ByEnglish; //会出现编译错误
hw.del += ByChinese; //直接+=就好
hw.HelloWorld("张三");
Console.ReadKey();
}
}
例三:
namespace ConsoleApp4
{
class Program
{
public delegate void P();
static void Main(string[] args)
{
MyDelegate.del += Person.Run;
MyDelegate.del += Person.Eat;
MyDelegate.LogEvent();
P p = Person.Run;
p += Person.Eat;
p();
Action action = Person.Run;
action += Person.Eat;
action();
Console.ReadKey();
}
public class Person
{
public static void Run()
{
Console.WriteLine(" 开始跑步!");
}
public static void Eat()
{
Console.WriteLine(" 开始吃饭!");
}
}
}
class MyDelegate
{
public delegate void myDelegate();
public static event myDelegate del;
public static void LogEvent()
{
if (del != null)
{
del();
}
}
}
}