2012-04-24 55 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; 

我建立這個對於一個例子,一塊代碼的圈複雜根據代碼分析是25

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

我的問題是明確的,如果別人和編譯器生成的日誌ic正在增加複雜性。但是,如何將代碼分析配置爲不在此級別上運行,而是將更簡單的編碼(預編譯)階段作爲第一個代碼片段進行評估(如果可能的話)?

+1

這是不可避免的,分析器從IL工作,而不是源代碼。而使用* dynamic *往往會產生對C#活頁夾調用的全部問題。你需要一種不同類型的分析儀。 – 2012-04-24 12:19:41

回答

4

根據代碼 分析那塊代碼的圈複雜度是25

我得到13只包含該代碼的方法。您使用的是哪個版本的Visual Studio,以及您定位的是哪個.NET Framework版本?

我的問題顯然是if else,編譯器生成的邏輯是 增加了複雜性。

是的,編譯器正在注入增加複雜性的指令。這不是它唯一的情況。 (匿名方法的使用是另一個著名的場景,其中CC是「強化」。)

但我怎麼可以配置代碼分析工具無法在這個層面上運作, ,而對簡單的編碼評估(預編譯)階段爲 第一個代碼片段,如果甚至可能的話?

這是不可能的。 Visual Studio代碼分析和代碼度量(這是引擎蓋下相同的獸人)使用的計算引擎僅分析編譯的IL。他們從不看源代碼。

如果你想的指標計算錯誤處理,你應該考慮在https://connect.microsoft.com/VisualStudio/feedback/details/729236/use-of-dynamic-types-makes-cyclomatic-complexity-almost-meaningless upvoting錯誤報告。

+0

至於語句,它創建圈25的複雜性並不重要海事組織,所以我是用我的實際代碼有一些語句和它超過25,以1度量上相同的代碼結果點不使用動態,但儘管如此,這回答了我的問題謝謝 – Andre 2012-04-24 13:47:57

+0

@ Andre:確切的CC值很重要,只是因爲這個問題反映了度量計算中的一個錯誤。 VS版本之間任何值的變化都表明可能嘗試解決該錯誤。一個不同但仍然不正確的值有可能表明嘗試修復該錯誤沒有按預期成功。 – 2012-04-26 13:22:09

相關問題