Откуда берется возвращаемое значение, например вызов метода, если он не заполнен в объявленной переменной ожидаемого типа? - PullRequest
6 голосов
/ 05 января 2012

Мы не обязаны заполнять возвращаемое значение, например, из вызова метода, в объявленную переменную ожидаемого типа, но что происходит с ней в этой ситуации?

Куда уходит следующее возвращаемое значение / Что происходитк нему:?

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"

(Этот вопрос НЕ является конкретнымдля значений типов, но также ссылочных типов)

Ответы [ 2 ]

8 голосов
/ 05 января 2012

Он извлекается из стека выполнения :

IL_000A:  call        System.Math.Round
IL_000F:  pop         

Если это ссылочный тип, ссылка будет извлечена из стека, и сам объект в конечном итоге будет собран GC (при условии, что у него нет других ссылок).

1 голос
/ 05 января 2012

Возвращаемое значение метода помещено в caller stack.Будет ли он использоваться, или нет, это вопрос кода caller.

РЕДАКТИРОВАТЬ

Пример:

void Main()
{
   var result = MyCoolFunc(10, 20); {1}
}

int MyCoolFunc(int prm1, int prm2) 
{
   return (prm1 + prm2);
}

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

Код виртуальной машины является кодом PSEUDO ине существует в реальной жизни.Он используется только для примера

...