C# 事件

简介: C# 事件

零、广播者和订阅者

使用委托的时候通常会出现两个角色,分别是广播者和订阅者。广播者包含委托字段,通过调用委托来决定何时进行广播。订阅者是方法目标的接收者,订阅者决定什么时候开始监听和结束监听,开始监听在委托上使用+=,结束监听在委托上使用-=。.NET环境下,一个订阅之不知道其他订阅者的存在,同时也不会干扰其他订阅者。


一、事件

事件(Event) 是一种结构,将广播/订阅模式正式化为语言特性,并且只暴漏所需的委托特性的部分子集。事件存在的主要目的是防止订阅者相互干扰。


1.声明事件

声明事件只需在委托前面加上 event 关键字即可。例子如下:

public delegate void StudentHandler(string name);
public class School
{
    public event StudentHandler student;
    // more code
    // ......
}

这里我们来解释一下上面的代码,我们在代码外侧定义了一个委托 StudentHandler ,并且在类 School 中定义了一个事件。在这段代码中 School 类中的所有代码可以把 student 完全当作委托来使用。但是在 School 类外部只能对 student 这个时间执行 +=和-=操作。


2.事件模式

.NET中有一个预定义框架类 System.EventArgs ,其中只有静态属性 Empty,所有的传递信息的类都必须继承自这个预定义框架类。 我们来通过一个例子来看一下:

public class SchoolEventArgs:System.EventArgs
{
    public readonly string Name;
    public SchoolEventArgs(string name)
    {
        Name = name;
    }
}

上面代码中的只读字段 Name 是我们要传递的信息,一般情况下要传递的信息会使用 属性 或者 只读字段


当我们编写完传递信息的类之后,就需要为事件定义委托了,为事件定义委托有如下几个硬性要求:


  • 返回类型必须是 void ;
  • 必须接受两个参数,第一个参数是 object (事件的广播者) ,第二个参数是 EventArgs 的子类 (要传递的信息);
  • 名称必须以 EventHandler 结尾

下面我们就行定义事件,定义事件就简单了,例子如下:

public delegate void StudentHandler(string name);
public class School
{
    public event StudentHandler student;
}

定义完事件之后还需要定义触发事件的方法,触发时间的方法也有如下两点要求:

  • 方法必须以 protected 修饰;
  • 方法名命名必须是On事件名* 的格式,并且接受一个 EventArgs 参数。

我们来看一下代码:

public delegate void StudentEventHandler(object source, SchoolEventArgs e);
public class School
{
    string name;
    public event StudentEventHandler studentEventHandler;
    protected virtual void OnStudentHandlerEventHandler(SchoolEventArgs e)
    {
        studentEventHandler?.Invoke(this,e);
    }
    public string Name
    {
        get { return name; }
        set
        {
            name = value;
            OnStudentHandlerEventHandler(new SchoolEventArgs(name));
        }
    }
}

到现在为止,我们该定义的都定义完了,现在我们来看一下怎么调用:

class Program
{
    static void Main(string[] args)
    {
        School school = new School();
        school.studentEventHandler += School_studentEventHandler;
        school.Name = "李四";
        Console.Read();
    }
    private static void School_studentEventHandler(object source, SchoolEventArgs e)
    {
        Console.WriteLine(e.Name);
    }
}

执行上述代码,得到如下结果:

image.png

目录
相关文章
|
1月前
|
C#
c# Gridview 点击checkbox 触发的事件
c# Gridview 点击checkbox 触发的事件
|
消息中间件 安全 API
C#实现操作Windows窗口句柄:SendMessage/PostMessage发送系统消息、事件和数据【窗口句柄总结之二】
SendMessage/PostMessage API 可以实现发送系统消息,这些消息可以定义为常见的鼠标或键盘事件、数据的发送等各种系统操作......
4260 1
C#实现操作Windows窗口句柄:SendMessage/PostMessage发送系统消息、事件和数据【窗口句柄总结之二】
|
30天前
|
存储 安全 C#
C# - 委托与事件
这篇文档介绍了C#中的委托和事件。委托是存储方法引用的类型,支持回调、事件处理,具有引用方法、类型安全、多播性等特性,并在异步编程中发挥作用。事件是委托的封装,提供保护和订阅机制,防止外部直接访问。当需要在类内部控制方法调用,防止外部误触发时,可使用事件。
|
16天前
|
C#
C#||委托和事件的实例
C#||委托和事件的实例
|
1月前
|
C#
C# Dev解决gridview1_SelectionChanged和gridview1_RowCellClick事件触发两次等问题
C# Dev解决gridview1_SelectionChanged和gridview1_RowCellClick事件触发两次等问题
C# Dev解决gridview1_SelectionChanged和gridview1_RowCellClick事件触发两次等问题
|
1月前
|
C#
C# 禁止ComboBox滚动事件细谈
C# 禁止ComboBox滚动事件细谈
|
1月前
|
Java C# C++
【从Java转C#】第八章:委托、lambda、事件
【从Java转C#】第八章:委托、lambda、事件
|
9月前
|
C# Windows
C#OOP之十一 委托和事件
C#OOP之十一 委托和事件
46 0
|
10月前
|
安全 C#
C#委托事件的区别
C#委托事件的区别
102 0
|
10月前
|
监控 安全 开发工具
Baumer工业相机堡盟工业相机如何通过BGAPI SDK使用DeviceEvents“设备事件”记录相机事件的各类时间(C#)
Baumer工业相机堡盟工业相机如何通过BGAPI SDK使用DeviceEvents“设备事件”记录相机事件的各类时间(C#)
73 0