我有一个问题,在我的公司中,我们使用毒性报告来测量静态代码,使用反射器代码度量作为毒性报告工具的输入,显然我可以看到代码的反汇编程序。我使用LINQ to Objects和to 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);
}我怎样才能摆脱它,任何推荐都会很受欢迎。
发布于 2012-03-30 06:54:45
除了微不足道的回答(Descendents属性不会给你提供空结果,所以你不需要测试它),没有...如果没有方法调用,就不能使用linq的where。
编译器将where转换为对System.Linq.Enumerable.Where的调用,这需要一个方法引用。如果您不喜欢编译器生成的方法,可以自己编写方法,但是如果您使用的是where,则必须有一个方法。
Func<XElement, bool> myFunc = this.FilterMethod;
List<XElement> result = xPnpInfo.Descendants("assignedSupport")
.Where(myFunc)
.ToList();..。
public bool FilterMethod(XElement source)
{
return source != null;
}https://stackoverflow.com/questions/9934689
复制相似问题