Валеэтап будет в штучной упаковке, когда объявляется как часть класса?
-
26-09-2019 - |
Вопрос
Учитывая этот класс:
public class Foo
{
public Int32 MyField;
}
Я думаю, что участник «Myfield» не находится на стеке потока, потому что, поскольку его можно получить доступ к нескольким потокам, он должен быть определенно в управляемой куче, но это означает, что это означает, что он используется в штучной упаковке и Unboxed каждый раз, когда используется каждый раз?
заранее спасибо
Решение
Нет, это не в штуку каждый раз, когда он используется. Бокс возникает только в том случае, если вы принуждали к типу значений в ссылочный тип - это действительно не имеет ничего общего, где была выделена фактическая память для значения (или даже если какая-либо память была выделена).
В вашем случае, это как вы действуете на Myfield, который определит, не будет ли он в штучной упаковке, а не как Foo обрабатывается.
//No Boxing
var f = new Foo();
f.MyField = 5;
int val = f.MyField;
//Boxing
var f = new Foo();
f.MyFIeld = 5;
object val = f.MyField;
Обратите внимание, что во втором примере val
Теперь содержит ссылку на коробопровод с INT. MyField
по-прежнему (и всегда будет оставаться) intobeed int и может быть доступен без Unboxing (спасибо за то, что указываете на необходимое уточнение, Луки)
Другие советы
Нет, тип значения не в штучной упаковке.
Бокс возникает только тогда, когда вы используете тип значения, как будто это объект, например, при хранении int
в массиве object
. Отказ То есть:
object[] a = new object[10];
int x = 1;
a[0] = x;
В этом случае тип значения коробка.
Но тип значений, хранящийся как поле внутри класса, не в штучной упаковке.
Нет, бокс происходит только тогда, когда тип значения обрабатывается как система .Object (обычно с помощью неявного литья, т. Е. Передача его в качестве параметра метода)
Типы значений получают только в Bobeded, когда они присваиваются на переменную типа ссылочного типа (например, object
). Если вы никогда не назначаете MyField
к чему-либо, кроме int или другой структуре, к которому он может быть сброшен (например, double
), это никогда не будет в штучной упаковке.