本地函数的代码被创建多少次?只调用一次或任何时候父函数?

c#

现代 C# 支持嵌套函数的定义。例如:

public bool Test(params int[] args) {
    bool isNumberValid(int i) {
        return i > 0;
   }
   foreach(var n in args) {
      if(!isNumberValid(n)) {
         return false;
      }
   }
   return true;
}

上面的例子我只是作为一个测试用例场景写的,能不能重构也无所谓。现在的问题是,isNumberValid函数创建了多少次?它是否只创建一次,从而被编译器移到父功能块之外?还是在调用父函数时在运行时重新创建(作用域在父堆栈下)?

回答

如果您使用反编译器检查输出,您将看到如下内容:

public bool Test(params int[] args)
{
    bool flag;
    int[] numArray = args;
    int num = 0;
    while (true)
    {
        if (num >= (int)numArray.Length)
        {
            flag = true;
            break;
        }
        else if (Program.<Test>g__isNumberValid|1_0(numArray[num]))
        {
            num++;
        }
        else
        {
            flag = false;
            break;
        }
    }
    return flag;
}

这说明它已经被编译成一个单独的方法,并且只编译了一次。

另请注意,对于本示例中如此小的本地函数,有可能(对于发布模式构建)JIT 编译器将内联该函数,因此甚至没有为其进行函数调用。

  • @ArnoldZahrneinder Yes, it's a static member of the enclosing class.

以上是本地函数的代码被创建多少次?只调用一次或任何时候父函数?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>