2016-05-05 3 views
0

Я застрял в терминологии программирования, которая меня смущает, и я не могу собрать свои мысли о том, как на самом деле и правильно выразить (написать) эти несколько предложений теории MSDN на странице Common Type System.Common Type System - Structures

Может кто-нибудь помочь мне в этом, я хочу это понять! И если кто-то будет так добр, чтобы написать какой-то код и прокомментировать эту проблему, было бы замечательно и похвально вам!

// Это текст (взят из «структур» пункт): https://msdn.microsoft.com/en-us/library/zcx1eb1e(v=vs.110).aspx#

«Для каждого типа значения, общее время выполнения языка предоставляет соответствующий коробочный тип, который является классом который имеет такое же состояние и поведение, что и тип значения. Экземпляр типа значения помещается в квадрат, когда он передается методу, который принимает параметр типа System.Object. Он распаковывается (то есть преобразуется из экземпляра класса обратно к экземпляру типа значения), когда управление возвращается из вызова метода, который принимает тип значения в качестве параметра для ссылки. Некоторые языки требуют, чтобы вы использовали специальный синтаксис, когда требуется тип в штучной упаковке; другие автоматически используют коробчатый тип, когда это необходимо. При определении типа значения, вы определяете как штучной и в Unboxed типа.»

Спасибо заранее, наилучшими пожеланиями!

ответ

0

object и тип значения сохраняются по-разному. object является указатель на память в куче, который содержит двоичное представление этого объекта. Стек представляет собой память, выделенную для хранения указателей и типов значений. Таким образом, функция не имеет указателя на integer или bool. Она передается копией фактического

Но если у вас есть способ:

string GetString(object o) 
{ 
    return o.ToString(); 
} 

Этот метод ожидает объект, указатель на местоположение в памяти, даже если вы передадите ему тип значения. Итак, чтобы сделать это, фреймворк должен создать объект, хранящийся в куче, содержащий int, чтобы он мог передать ссылку (указатель) на это значение функции. Это бокс.

Бокс неявный. Вам не нужно вызывать некоторую функцию преобразования для преобразования int в object.

Unboxing происходит, когда вы берете этот объект и применяете его как тип значения. Например,

object x = 5; //Boxes the value to create an object with a pointer 
var y = (int)x; //Unboxes the value, creating an int on the stack. 

Когда вы распаковывать объект, хранящийся в куче и ссылается x проверяется и его значение извлекается. Unboxing является явным. Когда вы конвертируете что-либо с object в тип значения, вы должны указать тип, в который вы его конвертируете.

+0

Я думаю, что они должны называть это «pointerizing» и «depointerising». Гораздо яснее. Нет ящиков. –

+0

Спасибо! Это было фактически о типе casting, теперь, когда вы выразили его с помощью кода, я понял его лучше, но все же последнее предложение для меня неясно: «Когда вы определяете тип значения, вы определяете как коробку, так и тип unboxed». - Как получилось, как типы в коробке, так и unboxed? – CSharp4eto