C# 如果未填入预期类型的声明变量,则方法调用返回的值将转到何处?
我们不必将方法调用返回的值填入预期类型的声明变量,但在这种情况下会发生什么 以下返回值去了哪里/它发生了什么:C# 如果未填入预期类型的声明变量,则方法调用返回的值将转到何处?,c#,.net,return-value,C#,.net,Return Value,我们不必将方法调用返回的值填入预期类型的声明变量,但在这种情况下会发生什么 以下返回值去了哪里/它发生了什么: decimal d = 5.5m; Math.Round(d, MidpointRounding.AwayFromZero); 显然,如果我想查看方法调用的结果,我将执行以下操作: decimal d = 5.5m; decimal d2 = Math.Round(d, MidpointRounding.AwayFromZero); // Returns 6 into
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"
(此问题不特定于值类型,但也适用于引用类型)从以下位置弹出:
如果它是引用类型,则引用将从堆栈中弹出,并且对象本身最终将由GC收集(假设它没有其他引用)。推送到调用方堆栈上的方法的返回值。是否使用它取决于调用方的代码 编辑 例如:
void Main()
{
var result = MyCoolFunc(10, 20); {1}
}
int MyCoolFunc(int prm1, int prm2)
{
return (prm1 + prm2);
}
一些虚拟机的Pesudo示例,跳过初始代码
如果我们不在第{1}var result
行上写入,那么它将在这里结束,如果是的话
应该有这样的东西
VM_ALLOC result //allocate space for result
VM_GETFROMSTACK // get content of the stack to result
虚拟机代码是一种伪代码,在现实生活中并不存在。它过去只是举个例子也许你需要问问爱丽丝+1对于有趣的问题,请进入丢失、遗忘和未引用返回值的黑暗空间。@George LOL!你刚刚成就了我的一天:-)但是IL堆栈是什么?如果能多读一些就好了,但我似乎找不到任何关于it@Shai:执行堆栈可能是更好的术语。在x86平台上,返回值通常会出现在CPU寄存器中(EAX或ST(0)[用于双精度/浮点]是其他编译器中的经典选择;不确定CLR抖动是否使用相同的约定);如果它不存储在任何地方,它最终会被寄存器的其他用途覆盖。那么值类型呢?他们也被抓到了吗?@亚历克斯:是的
double
是一种值类型。
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}
VM_ALLOC result //allocate space for result
VM_GETFROMSTACK // get content of the stack to result