c#为什么委托\事件不';在将其传递给另一个类后,无法进行更新

c#为什么委托\事件不';在将其传递给另一个类后,无法进行更新,c#,events,reference,delegates,invoke,C#,Events,Reference,Delegates,Invoke,调用在将事件传递给特定类后添加的委托时遇到问题,我认为该委托会作为对象获取更新 例如,这是我将委托传递给的类: 更新代码(由于评论中的一些问题) 这实际上是+-我需要如何运行它,其中“ExecutorOnCalculationCompleted”从不调用(请忽略睡眠和同步,我将代码压缩到所需的部分) 您直接在构造函数中传递委托。我想你想把这件事放到课堂上。例如: class Plus { public delegate void CalculationCompletEventHandle

调用在将事件传递给特定类后添加的委托时遇到问题,我认为该委托会作为对象获取更新

例如,这是我将委托传递给的类:

更新代码(由于评论中的一些问题) 这实际上是+-我需要如何运行它,其中“ExecutorOnCalculationCompleted”从不调用(请忽略睡眠和同步,我将代码压缩到所需的部分)


您直接在构造函数中传递委托。我想你想把这件事放到课堂上。例如:

class Plus
{
    public delegate void CalculationCompletEventHandler(int score);
    public event CalculationCompletEventHandler CalculationCompleted;

    private int a;
    private int b;

    public Plus(int a, int b)
    {
        this.a = a;
        this.b = b;
    }

    public void Calculate()
    {
        if (CalculationCompleted != null)
        {
            CalculationCompleted(a + b);
        }
    }
}
您现在可以这样使用它:

void Main()
{
    Plus plus = new Plus(1, 2);
    plus.CalculationCompleted += OnCalculationCompleted;
    plus.Calculate();

    plus.CalculationCompleted += OnCalculationCompleted2;
    plus.Calculate();        
}

private void OnCalculationCompleted(int score)
{
    Console.WriteLine("OnCalculationCompleted , score=" + score);
}

private void OnCalculationCompleted2(int score)
{
    Console.WriteLine("OnCalculationCompleted2 , score=" + score);
}
如注释中所述,如果委托类型用于程序的不同部分,则可能只需要事件本身

更新后的问题 如果您希望事件在执行器中,我只需将一个操作传递给您的每个类,如
Plus
Multiply
。。。并从执行器调用事件:

class Executor
{
    public delegate void CalculationCompletEventHandler(int score);
    public event CalculationCompletEventHandler CalculationCompleted;

    public void Start()
    {
        CalculationCompleted += OnCalculationCompleted;
        Plus plus = new Plus(1, 2, FireEvent);        
    }

    private void FireEvent(int score)
    {
        if (CalculationCompleted != null)
        {
            CalculationCompleted(score);
        }
    }

    private void OnCalculationCompleted(int score)
    {
        Console.WriteLine("OnCalculationCompleted , score=" + score);
    }
}

class Plus
{
    private int a;
    private int b;
    private Action<int> completionAction

    public Plus(int a, int b, Action<int> completionAction)
    {
        this.a = a;
        this.b = b;
        this.completionAction = completionAction;       
    }

    public void Calculate()
    {
        this.completionAction(a + b);
    }
}
类执行器
{
公共代表无效计算完成分数(int分数);
公共事件计算完成事件计算完成;
公开作废开始()
{
计算完成+=再次计算完成;
Plus Plus=新的Plus(1,2,FireEvent);
}
私人无效火灾事件(智力分数)
{
如果(CalculationCompleted!=null)
{
计算完成(分数);
}
}
计算完成后的私人无效(整数分数)
{
Console.WriteLine(“OnCalculationCompleted,score=“+score”);
}
}
班级加号
{
私人INTA;
私人INTB;
私人行动完成行动
公共加号(整数a、整数b、动作完成动作)
{
这个a=a;
这个.b=b;
this.completionAction=completionAction;
}
公共空间计算()
{
这是完成动作(a+b);
}
}

这是因为学员的参考资料不同
+=
使用委托创建一个新委托。实际上,组合事件必须在
Plus
方法中,为
Subtract
等编写相同的事件,委托必须在全局命名空间中,不要将其放入类中
Executor
将其方法订阅加减等单个事件您在这里实际要做什么?你的目标是什么?为使其正常工作,
Plus
需要拥有该事件,但是如果您添加一个
Multiply
类会发生什么?您好@M.kazemAkhgary,我更新了我的代码,希望这能澄清一些问题,请将其简化为一个类。目前没有足够的资源来实际运行代码,但您确实有超出您需要的资源。没错,但由于此委托(
CalculationCompletEventHandler
)似乎在多个类之间共享(如其名称所示),因此它不应位于
Plus
内,因此可以用于
Subtract
etc@M.kazemAkhgary好啊那么只有事件应该在
Plus
classHi@Nico内,我更新了我的代码,希望这能澄清一些问题!,那就行了!从父类调用事件。谢谢
class Executor
{
    public delegate void CalculationCompletEventHandler(int score);
    public event CalculationCompletEventHandler CalculationCompleted;

    public void Start()
    {
        CalculationCompleted += OnCalculationCompleted;
        Plus plus = new Plus(1, 2, FireEvent);        
    }

    private void FireEvent(int score)
    {
        if (CalculationCompleted != null)
        {
            CalculationCompleted(score);
        }
    }

    private void OnCalculationCompleted(int score)
    {
        Console.WriteLine("OnCalculationCompleted , score=" + score);
    }
}

class Plus
{
    private int a;
    private int b;
    private Action<int> completionAction

    public Plus(int a, int b, Action<int> completionAction)
    {
        this.a = a;
        this.b = b;
        this.completionAction = completionAction;       
    }

    public void Calculate()
    {
        this.completionAction(a + b);
    }
}