2012-03-29 158 views
0

我有一个问题,在我的公司,我们使用毒性报告来测量使用反射器代码度量作为毒性报告工具的输入的静态代码,显然我可以看到反汇编代码。我使用LINQ to Objects和XML来清除我的代码,但是我开始面临一些堆栈大小问题。我看到了反汇编的代码,并且我开始看到包含“where”linq子句的地方,它生成了一个委托并创建了一个方法,显然增加了我的堆栈大小,因为创建了更多的方法。有谁知道我该如何摆脱代表?这里有一个例子: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); 
} 

我怎样才能摆脱的是,任何建议都会受到欢迎。

+1

什么 “堆栈大小” 的问题你有没有和这是真实的还是想象? – BrokenGlass 2012-03-29 22:55:26

+0

这似乎是不成熟的优化。 Linq完全基于使用代表,我不认为你会在使用常规循环之外摆脱这种情况。 – rossisdead 2012-03-29 22:56:25

+0

这是真的,堆栈大小的问题是堆栈大小增加,因为创建方法(编译器生成)。看起来像rossisdead提到Linq是基于委托和委托使用方法的,所以我可以创建它们或者让编译器生成方法,无论如何创建的方法都会增加类的堆栈大小。 – 2012-10-02 13:24:50

回答

1

除了普通的snarky答案(Descendents属性不会给你null结果,所以你不需要测试),不...你不能使用linq的方法调用没有。

编译器将需要方法引用的地方调用到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; 
}