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这是正确的数字.
| 归档时间: |
|
| 查看次数: |
1484 次 |
| 最近记录: |