C# 事件

本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正

1.什么是事件

在看前,牢记事件的本质还是委托( C# 委托-CSDN博客),仍旧是包裹函数的一种方式

在C#中,事件(Event)是一种特殊的委托类型,用于在对象之间传递消息或通知

事件通常用于实现发布-订阅模式(Publisher-Subscriber Pattern)

  1. 发布者(Publisher):包含事件定义的对象
  2. 订阅者(Subscriber):响应事件的对象
  3. 事件处理器(Event Handler):订阅者用来处理事件的方法

图示:先发布和订阅

后写好触发方法,就可以触发了

waring:事件只能在声明它的类内部触发:事件只能在声明它的类内部调用(或结构体内)

这意味着只有发布者类可以触发事件,而订阅者类只能订阅和响应事件

2.事件的发布订阅与触发 (事件监听)

事件的声明包括但不限于下面两种方式:

cs 复制代码
//可以先定义一个委托,再定义事件
delegate void D(int t);
event D thisevent;
//或者直接用c#定义好的委托直接定义事件
event Action<int> thisevent1;

发布者

发布者类出一个事件和一个触发方法

cs 复制代码
class Publisher {
    
  
    //这里是一个定义好的事件
    public event Action<int> thisevent;

    //这里是一个自定义的触发函数
    public void Tigger(int a)
        {
    if(thisevent!=null)
            {
            //已被订阅就触发事件
            thisevent(a);
        }
    else
            {
            //抛出异常
            throw new Exception("未订阅事件,你用个der!");
        }
    }
}   

订阅者

订阅者类出一个函数:

cs 复制代码
class Subscriber
    { 
    //这个就叫事件处理器,感觉完全没必要,就叫响应函数也行啊
    public void AnyFunction(int t)
        {
        Console.WriteLine("事件已触发,订阅者响应,验证码:"+t);
    }
}

触发

cs 复制代码
Publisher publisher =new Publisher();
Subscriber subscriber =new Subscriber();
 //订阅
publisher.thisevent += subscriber.AnyFunction;
//触发
publisher.Tigger(1);

如果中途因为什么原因给事件没有被订阅,那么就会抛出异常

cs 复制代码
    Publisher publisher =new Publisher();
    Subscriber subscriber =new Subscriber();
    //订阅
    //publisher.thisevent += subscriber.AnyFunction;
    publisher.thisevent += null;
    //触发
    publisher.Tigger(1);

总览

cs 复制代码
    Publisher publisher =new Publisher();
    Subscriber subscriber =new Subscriber();
//订阅
//publisher.thisevent += subscriber.AnyFunction;
    publisher.thisevent += null;
    //触发
    publisher.Tigger(1);

class Publisher {
    
    #region 先定义委托再定义事件
    可以先定义一个委托,再定义事件
    //delegate void D(int t);
    //event D thisevent;
    或者直接用c#定义好的委托直接定义事件
    #endregion
    //这里是一个定义好的事件
    public event Action<int> thisevent;

    //这里是一个自定义的触发函数
    public void Tigger(int a)
        {
    if(thisevent!=null)
            {
            //已被订阅就触发事件
            thisevent(a);
        }
    else
            {
            //抛出异常
            throw new Exception("未订阅事件,你用个der!");
        }
    }
}   
class Subscriber
    { 
    //这个就叫事件处理器,感觉完全没必要,就叫响应函数也行啊
    public void AnyFunction(int t)
        {
        Console.WriteLine("事件已触发,订阅者响应,验证码:"+t);
    }
}

更能体现事件监听,监听二字的另外一种"上锁"的方法,就是再给触发部分加一部分条件(自定义的Monitor函数就是一个简单直白的体现)

cs 复制代码
    Publisher publisher =new Publisher();
    Subscriber subscriber =new Subscriber();
//订阅
    publisher.thisevent += subscriber.AnyFunction;
    //publisher.thisevent += null;
    //触发
    publisher.Monitor(5);

class Publisher {
    
    #region 先定义委托再定义事件
    可以先定义一个委托,再定义事件
    //delegate void D(int t);
    //event D thisevent;
    或者直接用c#定义好的委托直接定义事件
    #endregion
    //这里是一个定义好的事件
    public event Action<int> thisevent;

    //这里是一个自定义的触发函数
    public void Tigger(int a) {

        if (thisevent != null) {
            //已被订阅就触发事件
            thisevent(a);
        }
        else {
            //抛出异常
            throw new Exception("未订阅事件,你用个der!");
        }
    }
    //这里订阅一个监听函数
    public void Monitor(int monitor)
        {
        if(monitor>=5)
            {
            Tigger(monitor);
        }
        else
           {
            Console.WriteLine("条件不满足");
        }
        
    }
 
}   
class Subscriber
    { 
    //这个就叫事件处理器,感觉完全没必要,就叫响应函数也行啊
    public void AnyFunction(int t)
        {
        Console.WriteLine("事件已触发,订阅者响应,验证码:"+t);
    }
}
相关推荐
点心的游戏开发世界5 小时前
GDScript 入门笔记(十一):Lambda 与匿名函数
开发语言·笔记·游戏引擎·godot
事圆则缓7 小时前
Kotlin 协程完全指南
开发语言·kotlin
我爱写代码i7 小时前
BeLink - 支持生成多种URL 缩短网址PHP源码
开发语言·php·短网址php源码
Java后端的Ai之路7 小时前
20、Python - 备忘录模式
开发语言·人工智能·python·外观模式·备忘录模式
统计学小王子8 小时前
数学建模国赛倒计时4天——《统计模型精讲(混合效应模型R语言实现)》
开发语言·数学建模·r语言
知无不研8 小时前
c语言中循环的介绍与简单应用
c语言·开发语言·算法·循环·for·while
郝学胜-神的一滴9 小时前
Qt 高级编程 045:坐标体系深度实战
开发语言·c++·windows·python·qt·程序人生
dsyyyyy11019 小时前
JS复习,难点,易错点总结
开发语言·javascript·ecmascript
唐青枫10 小时前
别把日志、权限写进业务方法:C#.NET 动态代理从原理到实战
c#·.net
“AI国潮设计-小江”10 小时前
Python实战 | SDXL精准控制“普宁英歌舞×星空蛋糕”IP落地,附核心Prompt与商用授权思路
开发语言·人工智能·python·prompt·aigc