Visual Studio 2022或ReSharper能否按执行顺序展示成员引用树?
问题:按执行顺序追踪私有成员的赋值操作
背景
我正在重构一个类,其中多个私有方法会修改私有状态,很难追踪每个成员的最终取值。这些赋值操作大多独立于之前的值及彼此,布尔类型成员的最终状态由最后一次调用的赋值决定。
示例代码(VB.NET,逻辑适用于C#)
假设SetVisibilities为入口方法:
Dim isAVisible As Boolean Dim isBVisible As Boolean Dim isCVisible As Boolean Private Sub SetVisibilities() ChangeVisibilitiesFirst() ChangeVisibilitiesSecond() ' 这是C的最后一次修改,但在文件中是最早出现的引用(按行号) isCVisible = False End Sub Private Sub ChangeVisibilitiesSecond() isAVisible = False isBVisible = True isCVisible = True End Sub ' 这个方法先被调用,但在文件中定义较晚 Private Sub ChangeVisibilitiesFirst() isAVisible = True isBVisible = False isCVisible = True End Sub
期望的重构过渡形式
我希望先将每个成员的所有状态变更转换为以下形式,再进一步简化可见性逻辑:
Private Sub SetVisibilities() isAVisible = GetVisibilityForA isBVisible = GetVisibilityForB isCVisible = GetVisibilityForC End Sub Private Function GetVisibilityForA() As Boolean Dim response As Boolean response = True ' 来自: ChangeVisibilitiesFirst() response = False ' 来自: ChangeVisibilitiesSecond() Return response End Function Private Function GetVisibilityForB() As Boolean Dim response As Boolean response = False ' 来自: ChangeVisibilitiesFirst() response = True ' 来自: ChangeVisibilitiesSecond() Return response End Function Private Function GetVisibilityForC() As Boolean Dim response As Boolean response = False ' 来自: ChangeVisibilitiesFirst() response = True ' 来自: ChangeVisibilitiesSecond() response = False ' 来自: SetVisibilities() Return response End Function
当前手动处理方式
我从入口方法SetVisibilities开始,深度遍历每个方法调用及代码行,找到赋值操作后将其追加到对应成员的专属新方法中(有分支时也需追加)。
现有工具的不足
目前使用Visual Studio 2022的「查找所有引用」和「查看调用层次结构」功能,但存在问题:
- 「查找所有引用」按文件中的出现顺序列出引用,而非执行顺序。
- 「查看调用层次结构」的树状结构难以解析,比如
isCVisible的展示形式为:
- isCVisible - ChangeVisibilitiesSecond(), 调用 <b>isCVisible</b> 位于第15行 - SetVisibilities(), 调用 <b>ChangeVisibilitiesSecond()</b> 位于第7行 - SetVisibilities(), 调用 <b>isCVisible</b> 位于第5行 - ChangeVisibilitiesFirst(), 调用 <b>isCVisible</b> 位于第6行 - SetVisibilities(), 调用 <b>ChangeVisibilitiesFirst()</b> 位于第5行
而我期望的是按执行顺序展示的调用树:
- SetVisibilities() - ChangeVisibilitiesFirst() - 调用 <b>isCVisible</b> 位于第22行 - ChangeVisibilitiesSecond() - 调用 <b>isCVisible</b> 位于第15行 - 调用 <b>isCVisible</b> 位于第9行
提问
Visual Studio 2022(或ReSharper)能否按执行顺序展示成员的所有引用列表或树状结构?
内容的提问来源于Stack Exchange,提问作者JuanF
相关产品推荐
相关产品推荐

