这个委托订阅实际上做了什么

What does this delegate subscription actually do

我在一个项目中发现了这种类型的事件订阅,但我无法弄清楚它到底做了什么。下面我有一个完整的 class 实现来测试场景,提出问题的行是 _onScroll += _ => _onScroll3?.Invoke();_onScroll2 += () => _onScroll3?.Invoke();.
在测试代​​码之后,我可以得出的结论是 _onScroll_onScroll2 以某种方式复制了 _onScroll3 订阅者,但为什么要调用 Invoke 方法?

public class TestEvent
{
    private event Action<int> _onScroll;
    private event Action _onScroll2;
    private event Action _onScroll3;

    public void Subscribe()
    {
        _onScroll3 += HandleOnScroll;
        _onScroll3 += HandleOnScroll2;
    }

    public void DoWork()
    {
        _onScroll += _ => _onScroll3?.Invoke();
        _onScroll?.Invoke(0);
    }

    public void DoWork2()
    {
        _onScroll2 += () => _onScroll3?.Invoke();
        _onScroll2?.Invoke();
    }

    public void DoWork3()
    {
        _onScroll3?.Invoke();
    }

    private void HandleOnScroll()
    {
        Console.WriteLine(nameof(HandleOnScroll));
    }

    private void HandleOnScroll2()
    {
        Console.WriteLine(nameof(HandleOnScroll2));
    }
}
_onScroll += _ => _onScroll3?.Invoke();

这里添加了一个 lambda 表达式作为 _onScroll 的同级。如果您将此 lambda 重写为方法,您将得到以下内容:

private void OnScroll(int value)
{
    _onScroll3?.Invoke();
}

public void DoWork()
{
    _onScroll += OnScroll;
    _onScroll?.Invoke(0);
}

您可以直接拨打_onScroll3_onScroll3();。但是,如果 _onScroll3 没有订阅者并且是 null 怎么办?在调用之前你必须检查它是否是null。您可以通过使用安全导航来简化事情,或者您可以显式检查 null 然后直接调用。但是,如果 _onScroll3 在检查之后和实际调用之前变为 null 怎么办?您必须在检查之前复制实际值,然后调用该值。比较这两个做同样事情的例子:

_onScroll3?.Invoke();

var onScroll3Copy = _onScroll3;
if (onScroll3Copy != null)
{
    onScroll3Copy();
}