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