我有一个问题,在我的公司中,我们使用Toxicity报告来测量静态代码,使用反射器代码度量作为Toxicity Report工具的输入,显然我可以看到代码的反汇编程序。我正在使用LINQ to Objects和XML来使我的代码清晰,但我开始面临一些堆栈大小问题。我看到了反汇编代码,我开始看到我在其中包含“where”linq子句,它生成了一个委托,并且还创建了一个方法,显然增加了我的堆栈大小,因为它创建了更多的方法。有谁知道我怎么能摆脱代表?这是一个例子:
源代码:
List<XElement> toolPnP =
(from c in xPnpInfo.Descendants("assignedSupport")
where c != null
select c).ToList();
反汇编代码:
List<XElement> toolPnP = xPnpInfo.Descendants((XName) ("assignedSupport")).Where<XElement>(delegate (XElement c) {
return (c != null);
}).ToList<XElement>();
这些代表指的是:
[CompilerGenerated]
private static bool <.ctor>b__2(XElement c)
{
return (c != null);
}
我怎么能摆脱这一点,任何建议都会受到欢迎。
答案 0 :(得分:1)
除了简单的snarky回答(Descendents属性不会给你null结果,所以你不需要测试它),没有...你不能使用linq的没有方法调用的地方。 / p>
编译器将调用位置转换为需要方法引用的System.Linq.Enumerable.Where
。如果你不喜欢编译器生成的方法,你可以自己编写方法,但如果你在哪里使用,必须有一个方法。
Func<XElement, bool> myFunc = this.FilterMethod;
List<XElement> result = xPnpInfo.Descendants("assignedSupport")
.Where(myFunc)
.ToList();
...
public bool FilterMethod(XElement source)
{
return source != null;
}