【问题标题】:Use of assign event Action to another event Action使用将事件操作分配给另一个事件操作
【发布时间】:2022-01-21 03:19:31
【问题描述】:

给定以下代码:

public class A
{
    public event Action SomethingChangedA = null;

    public void Trigger()
    {
        SomethingChangedA?.Invoke();
    }
}

public class B
{
    public A a;
    public event Action SomethingChangedB = null;

    public B()
    {
        a = new A();
        //First approach
        a.SomethingChangedA += SomethingChangedB;
        //Second approach
        a.SomethingChangedA += () => SomethingChangedB?.Invoke();
    }
}

public class C
{
    public B b;

    public C()
    {
        b = new B();
        b.SomethingChangedB += DoSomethingOnC;
    }

    public void DoSomethingOnC()
    {
        Console.WriteLine("Something!");
    }
}

如果我打电话:

C c = new C();
A a = c.b.a;

a.Trigger();

我的第一个想法是输出将是“Something”2次,但事实是第一种方法没有被调用。

经过一番思考,在我看来是有道理的:

a.SomethingChangedA += SomethingChangedB;

不是在调用某些东西,而是只是在为操作保留的内存的...引用中分配?

我以为我知道发生了什么以及为什么会发生这种情况,但我不够聪明,无法向另一个人解释......所以我可能真的不知道为什么会发生这种情况。

所以我有两个问题:

  1. 我该如何解释为什么会发生这种情况?
  2. 什么类型的案例会在动作中使用这种assign方法 另一个动作?

【问题讨论】:

    标签: c# events event-handling action


    【解决方案1】:

    我认为 SomethingChangedA 是回调的集合。

    a.SomethingChangedA += SomethingChangedB;

    在此集合中注册 SmoethingChangedB。当触发时,所有订阅的方法都会被调用。

    看两种方法:方法二是懒惰的。因此,当实际调用时,SomethingChangedB 会被评估,而SomethingChangedB 不会在构造函数中分配。

    【讨论】:

    • 我不明白,SomethingChangedB是在构造函数中分配的,与方法1和2相同的地方:(
    • 不,方法2分配一个函数,在调用时分配值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    相关资源
    最近更新 更多