Структура упаковывается, когда вы хотите обработать ее как object
, поэтому, если вы вызовете Func
и назначите результат объекту, он будет упакован.
Например, при этом
object o = Func();
будет получен следующий IL
L_0000: call valuetype TestApp.foo TestApp.Program::Func()
L_0005: box TestApp.foo
L_000a: stloc.0
, который показывает, что возвращаемое значение упаковано, потому что мы присваиваем его ссылкевведите object
.
Если вы присваиваете ее переменной типа Foo
, она не упаковывается, поэтому она копируется и значение сохраняется в стеке.
Кроме того, в этом случае бокс вам не очень поможет, поскольку он предполагает создание объекта, представляющего значение структуры, и значения эффективно копируются во время операции упаковки.