本地函数的代码被创建多少次?只调用一次或任何时候父函数?
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.