[学习笔记][C#]委托与事件的区别

委托

委托是一种类型,表示对具有特定参数列表和返回类型的方法的引用。它可以看作是一个函数指针,允许你在运行时动态地调用方法。委托可以绑定多个方法,这些方法会按顺序被调用。

用法:

1.当作函数指针,实现对函数的注册,多个注册调用

2.当作回调函数,方法的参数,去定制化方法内容

实际用法:

声明委托 delegate void foo()

创建委托实例 var newfoo = new foo(需要传入参数)

调用 newfoo()  或者 newfoo.invoke()

为委托注册 newfoo += 一个返回值和参数和委托相同的方法

当作方法参数.

细节:

强类型委托Action与Func:他们是.net对于委托的封装,叫做强类型委托,简而言之就是提前写好的委托类型,可以直接使用。Action是无返回值void,Func是有返回值< , , 返回值>。

Lambda表达式:可以看作是委托的匿名函数的方便写法

返回值:如果你的委托有返回值,那么返回的是最后的那个方法

问题:

委托和函数指针的区别

委托和接口的区别

委托示例

public delegate void NotifyEventHandler(string message);

class Program
{
    static void Main()
    {
        NotifyEventHandler notify = null;

        notify += Notify1;
        notify += Notify2;

        notify("Hello, delegates!");
    }

    static void Notify1(string message)
    {
        Console.WriteLine("Notify1 received: " + message);
    }

    static void Notify2(string message)
    {
        Console.WriteLine("Notify2 received: " + message);
    }
}

事件

事件是基于委托的一种特殊成员(实例),用于封装多播委托并限制其访问权限。事件在类的外部只能被触发(调用)和订阅(注册/取消注册),不能直接赋值或清空。这种机制增加了安全性和封装性,确保事件只能由定义它的类来触发。

事件的本质

所以可实现自定义接口

区别(个人理解):

委托是一种用于动态地调用方法的类型(类似于函数指针),而事件是对委托的高级封装(感觉类似于字段与属性的关系),封装了委托,让委托需要通过一层设定好的逻辑来进行触发和订阅(增加方法),就是不能够直接再类的外面访问,需要再事件发布者类中,定义好触发事件的方法。

用法:

一个类的某些成员在发生变化的时候能被外界观测到

.NET标准事件模式

Delegate EventHander(object sender, EventArgs e)

命名规范:

名字+动词被动 OnEventRaised

注册的事件 On + 事件

事件示例

using System;

public delegate void NotifyEventHandler(string message);

public class Publisher
{
    // 定义事件
    public event NotifyEventHandler Notify;

    public void RaiseEvent(string message)
    {
        if (Notify != null)
        {
            Notify(message);
        }
    }
}

public class Subscriber
{
    public void OnNotify(string message)
    {
        Console.WriteLine("Subscriber received: " + message);
    }
}

class Program
{
    static void Main()
    {
        Publisher publisher = new Publisher();
        Subscriber subscriber = new Subscriber();

        // 订阅事件
        publisher.Notify += subscriber.OnNotify;

        // 触发事件
        publisher.RaiseEvent("Hello, events!");
    }
}

关键区别

  1. 封装性和安全性

    • 委托:可以在类外部直接赋值、清空或调用,这可能会带来安全问题。例如,某个代码片段可以意外地清空或替换所有已注册的委托。
    • 事件:只能在类内部触发(调用)和清空,外部代码只能订阅或取消订阅。这增加了对事件的控制和保护,防止外部代码意外地修改事件的订阅者列表。
  2. 设计意图

    • 委托:用于函数指针和回调,主要用于定义方法的引用,允许动态调用方法。
    • 事件:用于发布-订阅模式,主要用于通知和响应机制,强调的是一种消息传递和响应机制。
  3. 使用场景

    • 委托:适用于需要直接调用方法或实现回调机制的场景。
    • 事件:适用于需要实现发布-订阅模式的场景,如GUI编程中的按钮点击、异步编程中的通知等。

区别(个人理解):

委托是一种用于动态地调用方法的类型(类似于函数指针),而事件是对委托的高级封装(感觉类似于字段与属性的关系),封装了委托,让委托需要通过一层设定好的逻辑来进行触发和订阅(增加方法),就是不能够直接再类的外面访问,需要再事件发布者类中,定义好触发事件的方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值