在具有13个事件处理程序订阅的方法中,圈复杂度如何成为27?

Joh*_*ell 8 c# code-analysis fxcop cyclomatic-complexity code-metrics

我们有这个代码,排序:

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) => { };
}
Run Code Online (Sandbox Code Playgroud)

VS10 Ultimate中的代码分析称"21的圈复杂度".删除其中一条线会使圈复杂度达到25.

没有分支,所以这怎么可能?

use*_*902 17

请记住,代码分析正在查看程序集中的IL,而不是源代码.IL中没有任何内容支持lambda表达式,因此它们是编译器的构造.您可以在此处找到有关输出的详细信息.但基本上你的lambda表达式变成了一个私有的静态类,它是一个匿名的deligate.但是,每次在代码中引用匿名deligate的实例时,都会缓存deligate.因此,每次分配一个lambda表达式时,它都会检查是否已创建该lambda deligate的实例,如果是,则使用缓存的deligate.这会在IL中生成if/else,使复杂度增加2.因此,在此函数中,复杂度为1 + 2*(lambda express)= 1 + 2*(13)= 27这是正确的数字.