gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:07:34 24 4
gpt4 key购买 nike

我们有这样的代码,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 Ultimate 中的代码分析显示“圈复杂度为 27”。删除其中一条线使圈复杂度为 25。

没有分支,这怎么可能?

最佳答案

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

关于c# - 在具有 13 个事件处理程序订阅的方法中,圈复杂度如何达到 27?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10244131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com