Недавно я работал с некоторым кодом со свойством, которое отображало поле, которое было обновлено / создано пассивно, то есть только при его получении, и какой-то флаг указывал, что поле нуждается в обновлении.Это код:
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
Что вызывает это странное поведение?Кто звонит получателю раньше, чем мой код?