Валеэтап будет в штучной упаковке, когда объявляется как часть класса?

StackOverflow https://stackoverflow.com/questions/4216612

Вопрос

Учитывая этот класс:

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), это никогда не будет в штучной упаковке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top