using System;
using System.Threading;
namespace Lesson13_事件
{
#region 知识点一 事件是什么
//事件是基于委托的存在
//事件是委托的安全包裹
//让委托的使用更具有安全性
//事件是一种特殊的变量类型
#endregion
#region 知识点二 事件的使用
//申明语法:
//访问修饰符 event 委托类型 事件名;
//事件的使用:
//1.事件是作为成员变量存在于类中
//2.委托怎么用事件就怎么用
//事件相对于委托的区别:
//1.不能在类外部赋值
//2.不能在类外部调用
//注意:
//它只能作为成员存在于类和接口以及结构体中
public class Test
{
//委托成员变量,用于存储函数
public Action myFun;
//事件成员变量,用于存储函数
public event Action myEvent;
public Test()
{
//事件和委托的使用几乎一致,有一些细微区别
myFun = TestFun;
myFun += TestFun;
myFun -= TestFun;
myFun();
myFun.Invoke();
myFun = null;
myEvent = TestFun;
myEvent += TestFun;
myEvent -= TestFun;
myEvent();
myEvent.Invoke();
myEvent = null;
}
public void TestFun()
{
Console.WriteLine("一个函数");
}
public void doEvent()
{
if (myEvent != null)
{
myEvent();
} else
{
Console.WriteLine("Event is null");
}
}
}
#endregion
#region 知识点三 为什么有事件
//1.防止外部随意置空委托
//2.防止外部随意调用委托
//3.事件相当于对委托进行了一次封装让其更加安全
#endregion
class Program
{
static void Main(string[] args)
{
Console.WriteLine("事件");
Test t = new Test();
#region 知识点二 事件的使用
//委托可以在外部赋值
t.myFun = null;
t.myFun = Fun;
t.myFun = t.myFun + Fun;
//事件不可以在外部赋值,但是可以+,-
//t.myEvent = null; error
//t.myEvent = Fun; error
//t.myEvent = t.myEvent + Fun; error
t.myEvent += Fun;
t.myEvent -= Fun;
//委托可以在外服调用
t.myFun();
t.myFun.Invoke();
//事件不能在外部调用
//t.myEvent(); error
//t.myEvent.Invoke(); error
//只能在类的内部封装调用
t.doEvent();
Action act = Fun;
//事件不能作为临时变量在函数中使用的
//event Action eve = Fun; error
#endregion
Thread.Sleep(5000);
Console.Clear();
#region pratice-1
Heater ht = new Heater(0);
ht.doHeat();
#endregion
}
static void Fun()
{
Console.WriteLine("一个函数");
}
}
}
/* 总结
* 事件和委托的区别
* 事件和委托的使用基本上是一致的
* 事件是特殊的委托
* 主要区别:
* 1.事件不能在外部使用赋值“=”符号,只能使用“+”“-”;委托哪里都能用
* 2.事件不能在外部执行,委托哪里都可以
* 3.事件不能作为函数中的临时变量,委托可以
*/