gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 09:05:14 26 4
gpt4 key购买 nike

现代 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 函数创建了多少次?它是否仅以编译器将其移出父功能 block 的方式创建一次?还是在调用父函数(作用域在父堆栈下)时在运行时重新创建?

最佳答案

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

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;
}

这表明它已被编译为一个单独的方法,并且只编译一次。

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

关于c# - 本地函数的代码创建了多少次?只调用一次或任何时候调用父函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67468767/

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