Знакомая проблема использования VisualStudio - загадочный вызов методов получения свойств.Если они имеют побочные эффекты (наиболее распространенные из которых имеют вид if (foo == null) foo = new foo(); return foo;
), то тот факт, что окна отладчика Locals и Watch вызывают свойства - даже не затрагивая точки останова, - может привести к неожиданным эффектам при отладке.
Для этого есть простое решение: просто пометьте свойство атрибутом
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
Так как же найти геттеры, которые могут иметь побочные эффекты в большой базе кода?
NDepend является инструментом выбора для такого рода вещей: используя его язык CQL, я могу найти все свойства, которые, например, напрямую изменяют состояние содержащего их экземпляра:
SELECT METHODS FROM ASSEMBLIES "FOO"
WHERE IsPropertyGetter AND ChangesObjectState
Это находит только те получатели, которые изменяют поле напрямую: как я могу найти те, которые изменяют его косвенно, например, вызывая метод Initialize()
?