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

我们有这个密码,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# code-analysis fxcop code-metrics cyclomatic-complexity

相关文章:

c# - 为什么无论实际设置如何,页面加载时我的AppBar都显示为ClosedDisplayMode.Compact?

c# - StreamSocket:datareader.LoadAsync即使数据可用也将无限期等待

c# - OpenID提供者作为身份验证代理

c# - 私有变量访问

c# - 您知道一个很好的F#和C#互操作示例吗?

c# - 针对.Net 3.5框架的应用程序将在哪些平台上运行?

c# - 如何在Unity Inspector中创建多维数组?

c# - Gembox-获取ExcelCell的地址

c# - 调用堆栈在C#应用程序中的工作方式(给出的简单示例)

c# - 什么是Sql ExpressionVisitor