为什么回调操作指向未分配的方法?

问题描述 投票:0回答:1

我正在尝试将带有参数的方法作为回调动作。我的方法是通过委托分配回调操作。但是,当我调用回调时,未调用我在委托中使用的方法。而是调用了我声明了回调的方法。为什么会这样?

我以前已经使用过这种方法很多次,并且总是按预期的方式工作。

在下面的图片中,我希望回调的方法名称为“ OnPhaseFinished”,而不是“ StartCurrentPhase”:

enter image description here

c# callback delegates
1个回答
0
投票

让我们将您的代码放入SharpLab,并查看编译器生成的内容。

我正在使用此代码,它近似于您问题中的代码:

using System;
public class C {
    private Phase _currentPhase;

    private void StartCurrentPhase()
    {
        Action callback = delegate { OnPhaseFinished(_currentPhase); };
        _currentPhase.Activate(callback);
    }

    private void OnPhaseFinished(Phase currentPhase)
    {
    }
}

public class Phase
{
    public void Activate(Action callback) { }
}

然后编译器生成:

public class C
{
    private Phase _currentPhase;

    private void StartCurrentPhase()
    {
        Action callback = new Action(<StartCurrentPhase>b__1_0);
        _currentPhase.Activate(callback);
    }

    private void OnPhaseFinished(Phase currentPhase)
    {
    }

    [CompilerGenerated]
    private void <StartCurrentPhase>b__1_0()
    {
        OnPhaseFinished(_currentPhase);
    }
}
public class Phase
{
    public void Activate(Action callback)
    {
    }
}

See here on SharpLab

您可以看到编译器已将您的delegate { OnPhaseFinished(_currentPhase); };变成了C类的私有方法:

private void <StartCurrentPhase>b__1_0()
{
    OnPhaseFinished(_currentPhase);
}

然后它创建Action委托的实例,指向此生成的<StartCurrentPhase>b__1_0方法。

这是编译器通过创建一个新的私有方法(有时在当前类上,有时在一个全新的类上)来实现匿名委托(和lambda)的方法。

碰巧在当前类之后命名了它生成的<StartCurrentPhase>b__1_0方法,但这完全是它的决定-它可以将其命名为任何喜欢的名称。

© www.soinside.com 2019 - 2024. All rights reserved.