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

原文 标签 c# code-analysis fxcop code-metrics cyclomatic-complexity

我们有这个密码,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,这是正确的数字。

相关文章:

c# - FxCop警告CA1006有什么好的解决方法吗?

c# - FxCop投诉:公开的具体xml类型和一个不好的改进

javascript - 使用Identity Server 4和ASP.NET Identity添加外部登录

javascript - Babel插件-在静态代码分析后获取结构化信息作为输出

c# - 未知的代码分析错误

c++ - 有选择地禁用第三方库的C ++核心指南检查器

c# - 如何制作包含匿名对象的列表?

c# - 寻找一个简单的替代Thread.Sleep

c# - ASP.NET MVC不良做法:具有必需属性的可选子模型

c# - 检查NotImplementedExceptions的FxCop规则