浩明-空间 浩明-空间
首页
  • Unity

    • 类比法学c#
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《TypeScript 从零实现 axios》
    • TypeScript
    • JS设计模式总结
  • typescript杂谈

    • 为什么要用ts
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • vim学习
  • webgl基础
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 悟道
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

储浩明

热爱编程的小明
首页
  • Unity

    • 类比法学c#
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《TypeScript 从零实现 axios》
    • TypeScript
    • JS设计模式总结
  • typescript杂谈

    • 为什么要用ts
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • vim学习
  • webgl基础
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 悟道
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • JavaScript文章

  • Unity

    • C#类比学习
    • ts-c#的泛型
    • c#命名空间与es6模块
    • lambda表达式
    • c#和ts的异步编程
    • C#与ts的数组操作方法
    • c#与ts事件
    • c#和ts的继承
    • c#与ts接口
    • c#与ts类对象
    • 向量运算
    • 太阳系系统
    • C#中的事件与委托对比
      • 委托(Delegates)和事件(Events)
      • 基本定义与功能
        • 委托(Delegates)
        • 事件(Events)
      • 访问控制和保护级别
        • 委托
        • 事件
        • 委托
        • 事件
      • 事件管理机制示例
      • 委托示例
    • c#中的值类型和引用类型
  • 学习笔记

  • typescript杂谈

  • 前端
  • Unity
chuhaoming
2024-08-16
目录

C#中的事件与委托对比

# 委托(Delegates)和事件(Events)

在C#中,event关键字用于声明一个事件。事件是一种特殊的委托类型,它允许一个类通知其他对象发生了某个特定的事件 是C#中实现回调和事件处理的两个核心概念。尽管它们密切关联,但在机制和用法上存在一些本质的区别。下面将详细探讨委托和事件的不同之处:

# 基本定义与功能

# 委托(Delegates)

委托是一种类型,它可以持有一个或多个方法的引用。这些方法必须具有相同的签名(即参数列表和返回类型相同)。 委托的主要用途是将方法作为参数传递,或者将方法赋值给委托类型的变量,从而实现在运行时动态地决定调用哪个方法。

# 事件(Events)

事件是一种特殊的委托实例,它允许当特定的事情(如用户操作或者程序中的某个条件)发生时,通知一个或多个“监听者”方法。 事件使得发布者(事件的声明者)不需要知道订阅者(事件的处理者)的具体实现,只需通过事件访问器添加和移除订阅者。

# 访问控制和保护级别

# 委托

委托的访问权限可以是公有的 (public),也可以是私有的 (private),根据需要定义。 可以直接对委托进行赋值和清除操作,相对较为灵活但也可能导致误用。

# 事件

事件通常是公有的,但它们具有特定的添加 (add) 和移除 (remove) 访问器,这意味着不能直接对事件委托进行操作。 这种封装提供了更好的封装性和安全性,防止了外部类直接操作事件内部的委托。 使用场景和设计意图

# 委托

委托通常用于实现函数回调、迭代器模式、异步模式等。它的设计较为简单和通用。 例如,ThreadPool.QueueUserWorkItem接受一个WaitCallback委托,以异步执行工作项。

# 事件

事件主要用于实现观察者模式,例如GUI中的按钮点击、鼠标移动等事件。 例如,Windows Forms中的Button类有一个Click事件,当用户点击按钮时触发。

# 事件管理机制示例

using System;

// 定义一个事件发布者类
public class EventPublisher
{
    // 声明一个事件,使用EventHandler委托类型
    public event EventHandler MyEvent;

    // 触发事件的方法
    public void RaiseEvent()
    {
        // 检查是否有订阅者
        if (MyEvent != null)
        {
            // 调用所有订阅者的处理方法
            MyEvent(this, EventArgs.Empty);
        }
    }
}

// 定义一个事件订阅者类
public class EventSubscriber
{
    public void OnMyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("事件被触发了!");
    }
}

public class Program
{
    public static void Main()
    {
        // 创建事件发布者和订阅者对象
        EventPublisher publisher = new EventPublisher();
        EventSubscriber subscriber = new EventSubscriber();

        // 订阅事件
        publisher.MyEvent += subscriber.OnMyEvent;

        // 触发事件
        publisher.RaiseEvent();
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

# 委托示例

using System;

// 定义一个委托类型
public delegate void MyDelegate(string message);

public class DelegateExample
{
    // 使用委托作为参数的方法
    public void MethodWithDelegate(MyDelegate del)
    {
        del("Hello from the delegate!");
    }

    public static void Main()
    {
        // 创建一个委托实例并关联方法
        MyDelegate myDel = new MyDelegate(MethodToCall);

        // 创建DelegateExample对象并调用方法
        DelegateExample example = new DelegateExample();
        example.MethodWithDelegate(myDel);
    }

    // 与委托关联的方法
    public static void MethodToCall(string message)
    {
        Console.WriteLine(message);
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
编辑 (opens new window)
上次更新: 2024/08/23, 14:13:02
太阳系系统
c#中的值类型和引用类型

← 太阳系系统 c#中的值类型和引用类型→

最近更新
01
ARG
12-03
02
插件开发的核心原则
12-03
03
Python基础知识与js,c#,ts类比
03-19
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Haoming chu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式