Были пара последних вопросов о боксе ValueType в качестве объекта, в частности, произошли ли это в некоторых случаях.Бокс против ValueType по ссылке; Какая разница?
Что-то, что я понял, я не знаю, в чем разница между «боксом» ValueType (рассматривающим его как ссылочный объект) и просто доступом к нему по ссылке, например, используя ключевые слова ref или out (где то, что вы проходят только как «указатель»)? В обоих случаях значение находится где-то, где вы можете указать на него (для объекта это куча, для локального значения ValueType это ... где именно?).
Если бы мне пришлось угадать, из того, что я знаю о C++, я бы сказал, что он работает следующим образом: ValueType, к которому обращается ссылка (скажем, через ключевое слово параметра), остается на уровне стека вызовов, для которого он облагается , но указатель «shortcut» на ведро этой переменной в стеке создается и становится частью следующего слоя стека. Поскольку значение уже сохранено в памяти (возможно, даже в кэше процессора), вам не нужно создавать что-то новое в куче; единственной новой вещью является указатель, который является его собственным ValueType (IntPtr) и сам хранится в стеке, поэтому AFAIK будет быстрее, чем положить что-то в кучу.
Это то, что происходит, или есть что-то еще?
EDIT: Больше ясности:
public void TakesAnObject(Object obj) {...}
public void TakesAnIntValueType(ref int myValue) {...}
public void AnotherIntParameterMethod(out int myValue) {...}
...
//this locally-scoped variable is simply created on the stack.
int myInt = 5;
//Performs boxing; an Object is instantiated in the heap that holds the
//variable value from the stack, and that is passed by ref.
TakesAnObject(myInt);
//Apparently does NOT perform boxing, but we're still dealing with a reference.
//So what's going on?
TakesAnIntValueType(myInt);
//Again created on the stack, with the default 0.
int anotherInt;
//Again, apparently no boxing, but we're dealing with a reference to anotherInt.
AnotherIntParameterMethod(anotherInt);
Это поможет, если вы можете привести полные примеры двух сценариев, о которых вы говорите. Очень непонятно, что вы имеете в виду в данный момент. –