gpt4 book ai didi

properties - 我如何使用 NDepend 找到哪些属性 getter 有副作用?

转载 作者:行者123 更新时间:2023-12-02 04:15:01 24 4
gpt4 key购买 nike

使用 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

这只会找到那些直接改变字段的 getters:我怎样才能找到那些间接改变它的 getters,例如通过调用 Initialize() 方法?

最佳答案

Joel,这要归功于 Code Query through LINQ capabilities (CQLinq)。这是一个 CQLinq 查询,它检测属性 getter 的深度可变性。对于引发可变性的每个 getter,代码查询显示分配的字段集。

// Restrict the iteration only on property getters
// that are changing states or that call a method that changes state
let propertyGetters = Application.Methods.Where(m => m.IsPropertyGetter)

let methodsThatChangeState =
Application.Methods.Where(m => m.ChangesObjectState || m.ChangesTypeState)

from m in propertyGetters.DepthOfIsUsingAny(methodsThatChangeState).DefinitionDomain
.Union(propertyGetters.Intersect(methodsThatChangeState))

// Find all methods called directly or indirectly by the property getter
let methodsCalledIndirectly =
m.MethodsCalled.FillIterative(
methods => methods.SelectMany(m1 => m1.MethodsCalled))
.DefinitionDomain
.Union(m.ToEnumerable())

// Gather all field assigned that are not generated by the compiler
let fieldsAssigned = methodsCalledIndirectly
.SelectMany(m1 => m1.FieldsAssigned)
.Where(f => !f.IsGeneratedByCompiler)

where fieldsAssigned.Any()
orderby fieldsAssigned.Count() descending
select new { m, fieldsAssigned }

这个查询很复杂,主要是因为我优化了它,首先只保留本身改变状态的 getter,或者直接或间接调用正在改变状态的方法(调用 DepthOfIsUsingAny() ).

然后,对于每个 getter,我们构建所有直接或间接调用的方法集(感谢对 FillIterative() 的调用),并收集所有此方法分配的所有字段。

具体查询结果如下:

enter image description here

关于properties - 我如何使用 NDepend 找到哪些属性 getter 有副作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3289804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com