使用 VisualStudio 的一个常见问题是对属性 getter 的神秘调用。如果这些有副作用(最常见的形式是if (foo == null) foo = new foo(); return foo;
),那么调试器 Locals 和 Watch 窗口调用属性的事实 - 甚至没有遇到任何断点 - 可能会在调试时导致意想不到的效果。
有一个简单的解决方案:只需用属性标记属性
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
那么如何在大型代码库中找到可能有副作用的 getter 呢?
NDepend是此类事情的首选工具:使用它的 CQL 语言,我可以找到所有属性,例如,直接更改其包含实例的状态:
SELECT METHODS FROM ASSEMBLIES "FOO"
WHERE IsPropertyGetter AND ChangesObjectState
这只会找到那些直接改变字段的getter:我怎样才能找到间接改变它的getter,例如通过调用一个Initialize()
方法?