老蒋的知识库

  • 首页
  • 文章归档
  • 关于页面

  • 搜索

C# 避坑指南

发表于 2023-10-16 | 分类于 C# | 0 | 阅读次数 53

委托 Delegate、Event 区别

Delegate特性

Delegate官方翻译是委托 。delegate 本质上是一个用来存放函数的容器。众所周知,在面向对象的语言中,变量可以是值类型,也可以是引用类型。而 C# 则用 delegate 的机制将函数引用存储起来,并且可以在运行时被改变。delegate 特别用于实现事件和回调方法,一种委托将提前约定好存放的函数的返回类型和参数列表。

delegate 可以被初始化成一个函数的引用,也可以通过 +=,-= 等运算符进行存放多个函数引用。存放多个函数时,调用 delegate 将会调用所有的函数引用,这种行为叫做 multicast delegate,即委托的多播。

=会取消所有订阅,只保留=之后的订阅

//定义一个无返回值的,带一个int参数的委托
public delegate void myDelegate(int num);

// 定义一个委托,并添加订阅
public myDelegate m_delegate;

m_delegate += MyFun;

public void MyFun(int num)
{
  Debug.Log("my func: " + num);
}

// 此时 如果再使用 `=` 会取消前面所有的订阅,只保留 `=` 后的新订阅
m_delegate = MyFun1;  //MyFun订阅被取消,只有MyFun1在订阅中

Event特性

Event外部调用只能使用+=、-=增减委托,而不能直接使用=,避免出现委托因为误操作(或恶意)取消所有订阅。发布者是可以是用=。

public class A
{
    public delegate void ActionTest();
    public event ActionTest m_event;

    public void T()
    {
        m_event = MyFun; // 不报错
    }

    private void MyFun()
    {
        throw new NotImplementedException();
    }
}
public class B
{
    public A a;

    public void T()
    {
        a.m_event = MyFun; // 报错
        a.m_event += MyFun; // 不报错
        a.m_event -= MyFun; // 不报错
    }
    private void MyFun()
    {
        throw new NotImplementedException();
    }
}

image-1697456375667

  • 本文作者: jagger
  • 本文链接: /archives/c-bi-keng-zhi-nan
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
Unity 小技巧
Nginx 防御
jagger

jagger

66 日志
31 分类
0 标签
Creative Commons
0%
© 2026 jagger
由 Halo 强力驱动