gpt4 book ai didi

c# - 如何在 C# 中查找在当前范围之外定义的变量?

转载 作者:太空狗 更新时间:2023-10-29 17:59:10 24 4
gpt4 key购买 nike

我正在使用 Visual Studio 2013。我正在修改其他人留下的一些可怕的代码,这些代码几乎完全使用全局变量,并尝试清理它以便我可以正确封装每个函数并且不会在外部造成影响传入(或返回)它的内容。

有什么方法可以轻松地检查整个项目中是否存在在使用范围之外定义的变量?

我知道我可以点击一个变量,SHIFT+F12 会找到我对那个单个变量的用法,但我想在整个项目中找到所有这样的用法,因为问题真的很糟糕......它不仅仅是一两个全局变量,我说的是几十个。试图了解这个程序的流程和它的状态就足以让你喝个痛快!

最佳答案

应该有一个工具已经以树格式执行此操作,但如果没有 Find Usages 舞蹈,通常的嫌疑人似乎都没有。

因此,这里尝试使用反射 API,方法是查找所有成员变量,然后检查这些方法并确定它们是否触及它们。

此时您基本上是在查看 IL,因此除非您想自己计算解析规则,否则您将需要使用像 Cecil 这样的反汇编程序。我正在使用这个 deprecated single file implementation cause it's easy .像 Roslyn 分析器或 JustDecompile 插件之类的东西是另一条路线,但我没有这方面的经验。

必然会有边缘情况,如果您正在寻找整个依赖关系图,代码会复杂得多 - 但对于快速和粗略的分析,它至少应该让您有一个概览。

因此,基本上您使用反射和 IL 读取器从变量 -> 方法创建映射(您也可以采用其他方式,但值(value)可能较低):

var variables = typeof(SmallBallOfMud).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
var methods = typeof(SmallBallOfMud).GetMethods(BindingFlags.Instance | BindingFlags.NonPublic);

var d = new Dictionary<string, List<string>>();
foreach (var v in variables) d.Add(v.Name, new List<string>());

// this particular disassembler chokes on externally implemented methods
foreach (var m in methods.Where(m => (m.MethodImplementationFlags | MethodImplAttributes.IL) == 0)) {
var instructions = MethodBodyReader.GetInstructions(m);

foreach (var i in instructions) {
// we'll only check for direct field access here
var f = i.Operand as FieldInfo;
if (f == null) continue;
d[f.Name].Add(m.Name);
}
}

我们的结果会是这样的:

state1: Method1 (1), Method2 (1)
state2: Method2 (2)
state3: Method1 (1), Method2 (2)

读作“state3”被“Method1”使用一次,“Method2”使用两次。

关于c# - 如何在 C# 中查找在当前范围之外定义的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31194115/

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