4

私はこれに似たコードを持っています:

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;

例としてこれを作成しました。コード分析によると、そのコードの循環的複雑度は25です。

ILスパイでコードを分解すると、次のことがわかります。

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)
    }));
}
...

私の質問は明らかに、elseとコンパイラによって生成されたロジックが複雑さを増している場合です。しかし、可能であれば、このレベルで動作せず、最初のコードスニペットとしてより単純なコード化(コンパイル前)ステージで評価するようにコード分析を構成するにはどうすればよいですか?

4

1 に答える 1

4

コード分​​析によると、そのコードの循環的複雑度は25です。

そのコードのみを含むメソッドで13を取得します。使用しているVisualStudioのバージョンと、対象としている.NETFrameworkのバージョンはどれですか。

私の質問は明らかに、elseとコンパイラによって生成されたロジックが複雑さを増している場合です。

はい、コンパイラは複雑さを増している命令を注入しています。これは、そうする唯一のシナリオではありません。(匿名方式の使用は、CCが「拡張」されるもう1つのよく知られたシナリオです。)

しかし、可能であれば、このレベルで動作せず、最初のコードスニペットとしてより単純なコード化(コンパイル前)ステージで評価するようにコード分析を構成するにはどうすればよいですか?

これは不可能です。Visual Studio CodeAnalysisとCodeMetrics(内部では同じ獣)の両方で使用される計算エンジンは、コンパイルされたILのみを分析します。彼らはソースコードを見ることはありません。

メトリック計算のバグに対処したい場合は、https: //connect.microsoft.com/VisualStudio/feedback/details/729236/use-of-dynamic-types-makes-cyclomatic-complexity-でバグレポートに賛成票を投じることを検討してください。ほとんど意味がありません

于 2012-04-24T12:22:19.953 に答える