这个委托订阅实际上做了什么
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();
}
我在一个项目中发现了这种类型的事件订阅,但我无法弄清楚它到底做了什么。下面我有一个完整的 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();
}