在具有13个事件处理程序订阅的方法中,循环复杂性如何为27?[英] How can the cyclomatic complexity be 27 in a method with 13 event handler subscriptions?

本文是小编为大家收集整理的关于在具有13个事件处理程序订阅的方法中,循环复杂性如何为27?的处理方法,想解了在具有13个事件处理程序订阅的方法中,循环复杂性如何为27?的问题怎么解决?在具有13个事件处理程序订阅的方法中,循环复杂性如何为27?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我们有此代码,排序:

private void InitializeEvents()
{
    this.Event1 += (s,e) => { };
    this.Event2 += (s,e) => { };
    this.Event3 += (s,e) => { };
    this.Event4 += (s,e) => { };
    this.Event5 += (s,e) => { };
    this.Event6 += (s,e) => { };
    this.Event7 += (s,e) => { };
    this.Event8 += (s,e) => { };
    this.Event9 += (s,e) => { };
    this.Event10 += (s,e) => { };
    this.Event11 += (s,e) => { };
    this.Event12 += (s,e) => { };
    this.Event13 += (s,e) => { };
}

VS10 Ultimate中的代码分析显示" 27的环化复杂性".删除其中一条线使循环复杂性25.

没有分支正在进行,那么这是怎么可能的?

推荐答案

请记住,代码分析正在查看组件中的IL,而不是您的源代码. IL中没有什么可以在本地支持Lambda表达式,因此它们是编译器的构造.您可以找到什么是输出的细节 bory .但是基本上,您的lambda表达式变成了私人静态类,它是匿名代表.但是,相反,每当代码中引用匿名代表的实例,代表都会被缓存.因此,每次分配lambda表达式时,它都会进行检查以查看已创建Lambda委托的实例,如果这样,它使用了缓存的委托.在IL中生成IF/else,将复杂性增加2.因此,在此功能中,复杂性为1 + 2 *(lambda express)= 1 + 2 *(13)= 27,这是正确的数字.

其他推荐答案

C#编译器实际上为包括Lambdas在内的匿名方法生成了一些相当"有趣的" IL.对于每个人,它会创建一个私有字段,然后在消耗方法中分配其值之前,它检查了该值是否为null,该值将IF分支添加到编译方法中.代码指标工具应忽略此(http://social.msdn.microsoft.com/forums/eu/vstscode/thread/8c17f569-5ee3-4d26-4d26-bf09-4d4 d26-4ad44f9289705, https://connect.microsoft.microsoft.com/visalstudio/feedio/feedoio/feedback/详细信息/555560/method-used-unity-lambda-expressions-cuses-cuses-cligh-cyclomation-complexity ),我们可以希望最终能够.目前,如果您觉得这是假阳性的,那么您几乎必须忽略问题.

其他推荐答案

最好的猜测是,这可能是由于上面的陈述转换为事件访问格式,即

class MyClass
{
  private event EventHandler MyPrivateEvent;

  public event EventHandler MyEvent
  {
    add
    {
      MyPrivateEvent += value;
    }
    remove
    {
      MyPrivateEvent -= value;
    }
  }
}

参见/cc163533.aspx 教程/csharp-tutorial-event-Accessors 有关事件访问格式的讨论.

本文地址:https://www.itbaoku.cn/post/1793809.html