我们有这个密码,sortof:
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终极说“圈复杂度为27”。移除其中一行使得圈复杂度为25。
没有分支,怎么可能呢?
最佳答案:
请记住,代码分析关注的是程序集中的IL,而不是源代码。IL中没有本机支持lambda表达式的内容,因此它们是编译器的构造。你可以找到输出here的细节。但基本上,lambda表达式被转换为一个私有静态类,它是一个匿名的deligate。但是,不是每次在代码中引用匿名deligate时创建它的实例,而是缓存deligate。因此,每次分配lambda表达式时,它都会检查lambda deligate的实例是否已创建,如果是这样,它将使用缓存的deligate。在IL中生成IF/FER的复杂性增加了2。因此,在这个函数中,复杂度是1 + 2 *(lambda Express)= 1 + 2 *(13)= 27,这是正确的数字。