2012-04-24 18 views
4

を循環的複雑度> 25が発生します。ダイナミックキーワードは、私がこのようなコードの部分を持っているのVisual Studio 2010コード分析

dynamic a = new ValueHolder(); 
dynamic b = new ValueHolder(); 
dynamic c = new ValueHolder(); 

a.MtdActual = b.MtdActual + c.MtdActual; 
a.YtdActual = b.YtdActual + c.YtdActual; 
a.MtdVariance = b.MtdVariance + c.MtdVariance; 

私は例のためにこれを作成し、コードのその部分の循環的複雑度私の質問は明確であれば、他とコンパイラ生成されたログです

object a = new ValueHolder(); 
object b = new ValueHolder(); 
object c = new ValueHolder(); 
if (Program.<ConsumeA>o__SiteContainer2.<>p__Site3 == null) 
{ 
    Program.<ConsumeA>o__SiteContainer2.<>p__Site3 = CallSite<Func<CallSite, object, object, object>>.Create(Binder.SetMember(CSharpBinderFlags.None, "MtdActual", typeof(Program), new CSharpArgumentInfo[] 
    { 
     CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null), 
     CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) 
    })); 
} 
Func<CallSite, object, object, object> arg_159_0 = Program.<ConsumeA>o__SiteContainer2.<>p__Site3.Target; 
CallSite arg_159_1 = Program.<ConsumeA>o__SiteContainer2.<>p__Site3; 
object arg_159_2 = a; 
if (Program.<ConsumeA>o__SiteContainer2.<>p__Site4 == null) 
{ 
    Program.<ConsumeA>o__SiteContainer2.<>p__Site4 = CallSite<Func<CallSite, object, object, object>>.Create(Binder.BinaryOperation(CSharpBinderFlags.None, ExpressionType.Add, typeof(Program), new CSharpArgumentInfo[] 
    { 
     CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null), 
     CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) 
    })); 
} 
... 

:コード分析によるILのコードをdissasemblingすると25

であるあなたがこれを見ることができますスパイicは複雑さを増しています。しかし、このレベルでは動作しないようにコードアナリシスを設定し、可能であれば単純なコード化(プレコンパイル)ステージを最初のコードスニペットとして評価する方法はありますか?

+1

これは避けられませんが、アナライザはソースコードではなくILから動作します。 * dynamic *を使うと、C#バインダーへの呼び出しの全体をチェックする傾向があります。別の種類のアナライザーが必要です。 –

答えて

4

コードの解析によれば、コードのその部分の循環的複雑度は、私は、そのコードを含む方法13を得る25

あります。どのバージョンのVisual Studioを使用していますか、どの.NET Frameworkのバージョンをターゲットにしていますか?

私の質問は明らかにif elseとコンパイラによって生成された論理が であり、複雑さが増しています。

はい、コンパイラは複雑さを増している命令を注入しています。これがそうである唯一のシナリオではありません。

(匿名メソッドの使用は。CCは「強化」されている他のよく知られたシナリオである)しかし、どのように私は、コード分析がこのレベルで動作しないように設定することもできますし、むしろ シンプルなコード化された上で評価する(前コンパイル)ステージとして の最初のコードスニペット、可能であれば?

これは不可能です。ビジュアルスタジオコード分析とコードメトリック(両方とも同じビースティです)で使用される計算エンジンは、コンパイルされたILだけを分析します。彼らはソースコードを見ることはありません。

メトリック計算のバグを解決したい場合は、バグレポートupvotingをhttps://connect.microsoft.com/VisualStudio/feedback/details/729236/use-of-dynamic-types-makes-cyclomatic-complexity-almost-meaninglessにしてください。

+0

25の循環的複雑さを作成するという記述は重要ではありません。私の実際のコードにはいくつかのステートメントがあり、25を超えています。同じコード結果でメジャー1それにもかかわらず、これは私の質問に答えました – Andre

+0

@Andre:この問題はメトリック計算のバグを反映しているため、正確なCC値は重要です。 VSバージョン間の値の変更は、バグに対処する可能性のある試みの兆候です。違うがそれでもなお不正確な値は、バグを修正しようとする試みが期待どおりに成功しなかったことを潜在的に示します。 –

関連する問題