c# 进阶 事件

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.事件不能作为函数中的临时变量,委托可以
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值