如果引用类方法的 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#。