2012-03-29 191 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; 
}