2015-09-26 2 views
2

Привет, у меня есть быстрый вопрос (закрытый вопрос). Я столкнулся во время изучения концепции бокса и распаковки в C#:Является ли переменная типа объекта ссылкой, и все? или может ли это быть ссылкой на ссылку?

Переменная типа «объект», которая является переменной ссылочного типа, может принимать копия переменной типа значения или переменной ссылочного типа.

Рассмотрим переменную типа объекта, объявленную в стеке.

Во-первых, он принимает копию переменной типа значения:

int a; 
object b = a; 

А во-вторых, он принимает копию переменной ссылочного типа:

string c; 
object d = c; 

Теперь вопрос здесь: По сравнению с первая переменная объекта-объекта (объект b), которая представлена ​​в памяти по ссылке в стеке с данными типа int в куче, вторая переменная объекта-объекта (объект d), будет иметь ссылку в стека к данным строкового текста в куче, или, скорее, он будет иметь рефери ce в стеке к другой ссылке в куче к данным строкового текста?

Другими словами делает:

string X = "ABC"; 

равна:

object Y = "ABC"; 

или как:

object Z = X; 

или нет

.........

Спасибо, ребята, заранее.

+0

Спасибо Хоссейну за редактирование. – Physician

+0

Не нужно благодарить, редактирование - обычная задача в StackOverflow :) –

ответ

2

Тип ссылки не в штучной упаковке. Вы должны назначать ссылку от одной переменной к другой. Единственное копирование, которое происходит, это ссылка (обычно реализуемая как указатель). Данные в объекте не копируются, но остаются там, где они есть.

Вы более или менее верны в отношении типов значений.

Я бы посоветовал вам не думать о куче и стеке. Это детали реализации. Более того, не верно, что типы значений всегда живут в стеке. Вместо этого вы должны думать об этом с точки зрения семантики копирования. Типы значений всегда копируются, а ссылочные типы - нет. Вот и все.

EDIT: Я перечитал ваш вопрос, чтобы попытаться понять, о чем вы действительно спрашиваете, поэтому я могу ответить более четко.

X - локальная переменная типа string, которая содержит ссылку на объект типа string. Y - локальная переменная типа object, которая содержит ссылку на объект типа string. Это разрешено, потому что string происходит от object, и переменная может безопасно содержать ссылку на объект своего типа или любой тип, из которого выводится этот тип (класс или интерфейс). Z - локальная переменная типа object, которая содержит ссылку на объект типа string.Это функционально то же самое, что и X. У вас просто есть две переменные, содержащие ссылку на один и тот же объект. Дополнительных ссылок не происходит.

Я думаю, вы можете быть смущены, потому что, возможно, вы думаете, что создание ссылки происходит во время назначения. Все назначение - копирование ссылки (для ссылочных типов) и копирование значения (для типов значений). Вы можете создать ссылку на ссылку с помощью ключевого слова ref в параметре метода.

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

+0

Спасибо за ваш ответ siride, действительно Фактически я знаю, что тип значения не всегда находится в стеке, если он является членом экземпляра объекта, или он был статическим членом класса, он будет жить в куче, на самом деле я вообще не сказал обратное в вопросе, Теперь вернемся к ответу, который вы предоставили, так как без бокса для ссылочных типов это означает, что в мой вопрос: переменные X, Y и Z одинаковы в управлении памятью, все с одной ссылкой в ​​стеке с данными в куче (с Z и X, использующими одну и ту же ссылку, а Y имеет свою уникальную ссылку)? – Physician

+0

Благодарим вас за пересмотр вопроса, это приятно от вас, я его ценю. И ответ для меня просто идеален, спасибо, брат. На самом деле, я знаю, что ссылка создается скорее при объявлении переменной, а не при назначении ее значению (или адресу, в котором значение находится, я думаю), – Physician

+0

Но что меня смутило, это отсутствие знаний о том, что ссылка не будет быть помещен в коробку, но скорее скопирован достаточно просто, как копирование любой ссылочной переменной типа, и здесь переменная типа объекта не является уникальной. Остальная часть вашего ответа я чувствую, что вернусь к нему, когда мой уровень знаний будет расти. Еще раз спасибо за разъяснения. – Physician

1

a копируется по значению при боксе. b относится к размеру в штучной упаковке a. a и b являются независимыми.

То же самое верно для второго примера, но нет бокса. Ссылка скопирована.

Назначение в C# всегда копирует значение или ссылку. Он никогда не создает ссылку на место хранения.

бы это есть ссылка в стеке на данные строки текста в куче или, скорее, это будет иметь ссылку в стеке на другую ссылку в куче на данные строки текста

Ничего из этого. Ссылки на объекты в C# всегда указывают на объект, а не на другую ссылку. Нет такой вещи, как цепочка ссылок.

+0

Спасибо вам за ваш ответ, первая цитата содержит ошибку, которую я сделал непреднамеренно, что, кажется, меняет смысл, я исправил его в вопросе, Извините за это. – Physician

+0

Хорошо, на ваш вопрос ответили? – usr

+0

Да, это довольно релевантное и точное объяснение, однако ответ mr sirirde выше более подробно, так что это помогло мне немного больше понять, поэтому я принял его как ответ на мой вопрос, спасибо за ваше усилие брат – Physician

Смежные вопросы