【问题标题】:c# - Propery getter automatically called when debugging for passive propertyc# - 调试被动属性时自动调用属性获取器
【发布时间】:2019-02-19 18:35:49
【问题描述】:

我最近正在处理一些带有属性的代码,该属性公开了一个被动更新/创建的字段,只有在获取它并且一些标志表明该字段需要更新时。这是代码:

static void Main(string[] args)
{
        var someClass  = new SomeClass();
        Console.WriteLine(someClass.ClassString);
        Console.ReadKey();
}

class SomeClass
{
    private bool _dirtyFlag;

    private String _classString;

    public String ClassString
    {
        get
        {
            Console.WriteLine("dirty flag value in getter: " + _dirtyFlag);
            Console.WriteLine("_classString value in getter: " + _classString);
            if (_dirtyFlag)
            {
                _classString = "new value";
                _dirtyFlag = false;
            }
            return _classString;
        }
    }

    public SomeClass()
    {

        SetDirtyFlag();

        Console.WriteLine("dirty flag value in constructor: " + _dirtyFlag);

        Console.WriteLine("_classString value in constructor: " + _classString);

    }


    public void SetDirtyFlag()

    {
        _dirtyFlag = true;
    }
}

在调试代码时,我发现了一些奇怪的行为:标志值自动从 true 设置为 false,并且即使 ClassString 也会更新 _classString > 没有被调用(不知何故,getter 是从代码以外的其他地方调用的)。此外,在 ClassString getter 中设置断点不会显示第一次调用 getter 的时间(这不是来自我的代码的调用)。我会得到如下输出:

dirty flag value in getter: True
_classString value in getter:
dirty flag value in constructor: False
_classString value in constructor: new value
dirty flag value in getter: False
_classString value in getter: new value
new value

是什么导致了这种奇怪的行为?谁在我的代码之前调用了 getter?

【问题讨论】:

    标签: c# debugging properties field getter


    【解决方案1】:

    调试器在您的代码调用之前调用您的 getter 代码。

    调试您的代码并且仅当您正在检查 ClassString 的值(当变量在 Visual Studio 的 Locals 窗口中可见时),Visual Studio 才会尝试获取变量的值以在调试窗口中显示它们。然后在这种情况下调用 getter 并根据您的代码更新您的变量

    还值得注意的是,如果有断点,来自调试器的 getter 调用不会停止,因为断点仅适用于主执行线程。换句话说,代码的调试器调用忽略了断点。

    【讨论】:

      猜你喜欢
      • 2015-04-15
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 2021-08-01
      相关资源
      最近更新 更多