2012-03-29 10 views
0

私の会社では毒性レポートを使用して毒性レポートツールの入力としてリフレクタコードメトリックを使用して静的コードを測定していますが、明らかにコードの逆アセンブラが表示されます。私はオブジェクトとXMLにLINQを使ってコードをクリアにしていますが、スタックサイズの問題に直面します。私は逆アセンブルされたコードを見て、どこで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

+0

これは時期尚早の最適化のようです。 Linqはデリゲートを使用することに完全に基づいているため、通常のforループを使用すること以外ではそれをやり遂げることはできません。 – rossisdead

+0

これは本当のことであり、スタックサイズの問題は、メソッドの作成(コンパイラ生成)のためにスタックのサイズが増えていることです。 Linqはデリゲートに基づいており、デリゲートはメソッドを使用するので、私はそれらを作成することができます。あるいは、メソッドを生成するためにコンパイラにメソッドを生成させることもできます。 –

答えて

1

簡単なスカーキーの回答(Descendentsプロパティはnull結果を返さないため、テストする必要はありません)、いいえ... linqはメソッド呼び出しなしでは使用できません。

コンパイラは、メソッドの参照を必要とする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; 
}