如果没有填充到预期类型的声明变量中,则方法调用的返回值将转到哪里

本文关键字:返回值 调用 方法 填充 类型 声明 如果没有 变量 | 更新日期: 2023-09-27 18:19:28

我们不必将方法调用的返回值填充到预期类型的声明变量中,但在这种情况下会发生什么?

下面的返回值去了哪里/它发生了什么:?

decimal d = 5.5m;
Math.Round(d, MidpointRounding.AwayFromZero);
<小时>

显然,如果我想查看方法调用的结果,我会执行以下操作:

decimal d = 5.5m;
decimal d2 = Math.Round(d, MidpointRounding.AwayFromZero); // Returns 6 into 
                                                           // the variable "d2"

(这个问题不是特定于值类型,也包括引用类型)

如果没有填充到预期类型的声明变量中,则方法调用的返回值将转到哪里

它从执行堆栈中弹出:

IL_000A:  call        System.Math.Round
IL_000F:  pop         

如果是引用类型,则引用将从堆栈中弹出,对象本身最终将由GC收集(假设它没有其他引用)。

caller stack上推送的方法的返回值。它会不会被使用,是caller的代码问题。

编辑

示例:

void Main()
{
   var result = MyCoolFunc(10, 20); {1}
}
int MyCoolFunc(int prm1, int prm2) 
{
   return (prm1 + prm2);
}

一些VM的Pesudo示例,跳过初始代码

VM_PUSH 10 //prm1 stack state is {10}
VM_PUSH 20 //prm1  stack state is {10,20}
VM_EXEC MyCoolFunc //call function which executes what need, removes from stack those 2 values and pushes result of the function execution. stack state is {30}

如果我们不在第{1}var result行上写入,则在这里结束,如果是应该有这样的

VM_ALLOC result //allocate space for result
VM_GETFROMSTACK // get content of the stack to result

虚拟机代码是伪代码,在现实生活中不存在。它只是用来举一个例子