C# 动作调用正在改变 `this`

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

TL;博士

如果引用类方法的 C#

Action
仍然引用原始的
Target
,那么为什么当我调用
this
并在该方法中设置断点时
Action
被更改?

更多背景

我在 .NET 项目中有以下设置:


// MyClass.cs
public class MyClass
{
    private float _someValue = -1f;
    private int _instanceId = 12345;

    public void Method()
    {
        Updater.Instance.RegisterUpdate(_instanceId, doStuff);
    }
    private void doStuff(float deltaTime)
    {
        // Do stuff with _someValue
    }
}

// Updater.cs
public class Updater
{
    public static Updater Instance = new();

    private readonly List<Action<float>> _updateActions = new();

    public void RegisterUpdate(int instanceId, Action<float> updateAction)
    {
        // Validation...
        _updateActions.Add(updateAction);
    }
    public void Update()
    {
        foreach (Action<float> action in _updateActions)
            action.Invoke(Time.deltaTime);
    }
}

本质上,

Updater
包装了一个已注册
Action
的列表,并在调用
Update
时调用它们。

在 Visual Studio 中,我可以在

MyClass.doStuff()
中设置断点,并且当
Updater.Update()
被调用时它们会被击中。不幸的是,在断点处暂停时,当我将鼠标悬停在
_someValue
的值上时,我没有得到任何值,甚至在本地窗口中也没有提到该字段,当我在立即窗口中输入
_someValue
时,我得到“The标识符
_someValue
不在范围内”。另外,Locals Window中的
this
值是
Updater
类型,不是
MyClass

然而,一切正常。

doStuff
中与
_someValue
一起使用的条件逻辑在我单步执行时仍按预期工作,我只是无法在单步执行时检查值,这使得调试变得困难。此外,当我将调用堆栈上升到
Updater.Update
并检查
_updateActions
的当前元素时,我可以看到它的
Target
属性已正确设置为
MyClass
的实例。那么这里发生了什么?试图弄清楚
this
是什么感觉就像 JavaScript 废话哈哈,而不是 C#。

c# debugging delegates action
© www.soinside.com 2019 - 2024. All rights reserved.