Собственный метод get, вызываемый автоматически при отладке пассивного свойства - PullRequest
0 голосов
/ 19 февраля 2019

Недавно я работал с некоторым кодом со свойством, которое отображало поле, которое было обновлено / создано пассивно, то есть только при его получении, и какой-то флаг указывал, что поле нуждается в обновлении.Это код:

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 не вызывался (каким-то образом вызывающий метод вызывался не из кода).Кроме того, установка точки останова в методе получения ClassString не будет отображаться при первом вызове метода получения (что не было вызовом из моего кода).Я хотел бы получить такие результаты, как:

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

Что вызывает это странное поведение?Кто звонит получателю раньше, чем мой код?

1 Ответ

0 голосов
/ 19 февраля 2019

Отладчик вызывает ваш код получателя до того, как ваш код сделает.

При отладке вашего кода и только если вы проверяете значение ClassString (когда переменная видна в окне Locals Visual Studio), тогда Visual Studio попытается получить значение переменных, чтобы отобразить их в окне отладки.Тогда в этом случае вызывается метод получения и ваши переменные обновляются в соответствии с вашим кодом.

Стоит также отметить, что этот вызов метода получения отладчика не останавливается, еслиявляется точкой останова , поскольку точки останова применяются только к основному потоку выполнения.Другими словами, вызовы кода отладчиком игнорируют точки останова.

...