Ссылочные типы, присваивания, Box/Unbox, куча, стек
От: vad_vadim Беларусь  
Дата: 27.05.03 14:18
Оценка: 6 (1)
Есть примерчик:


using System; 
namespace Qwer 
{ 
class Simple
{ 
public int f; 
} 
class Test
{ 
public static void Main() 
{ 
int i = 123; 
object o = i; 
object o1 = o; 
o1 = 345; 
Console.WriteLine("o = {0}, o1 = {1}", o, o1); 

Simple a = new Simple(); 
a.f = 1; 
Sample b = a; 
a.f = 2; 
Console.WriteLine("a.f = {0}, b.f = {1}", a.f, b.f); 
Console.ReadLine(); 
} 
} 
}


нА экране получаем:
o = 123, o1 = 345
a.f = 2, b.f = 2 — ПОЧЕМУ ???


----------------------------------------
При присваивании i к о создается объект в куче, который и содержит значение 123
Когда мы присвоили о1 = о — мы скопировали адрес ссылки и теперь о1 указывает на тот же объект, что и о
о1 = 345 — 345 неявно приводится к оbject, то есть в куче создается объект, который содержит значение 345, значит о1 будет указывать на ДРУГОЙ объект в куче
когда мы b=a, соответственно b тоже указывает на тот же объект в куче, что и а
когда мы a.f = 2 — так как f — имеет тип int и присваивается ему тоже тип целый, то нового объекта в куче не создается и соответственно объекты a, b продолжают указывать на один и тот же объект в куче и поэтому на экране получаем такие результаты. . .
ПРАВ ЛИ Я В СВОИХ РАССУЖДЕНИЯХ ?
И есть ли вариант, что рассуждая таким образом я получу неверные результаты?
Успешные люди ориентируются на достижение побед, неудачники — на избегание неудач
Re: Ссылочные типы, присваивания, Box/Unbox, куча, стек
От: WFrag США  
Дата: 27.05.03 14:56
Оценка: 1 (1)
Здравствуйте, vad_vadim, Вы писали:

Если хочешь знать все тонкости, читай Рихтера, "Applied MS .NET Framework Programming"
7. О чем невозможно говорить, о том следует молчать.
Re: Ссылочные типы, присваивания, Box/Unbox, куча, стек
От: Lloyd Россия  
Дата: 27.05.03 15:09
Оценка: +1 :)
Здравствуйте, vad_vadim, Вы писали:

_> И есть ли вариант, что рассуждая таким образом я получу неверные результаты?


Рассуждая любым образом можно получить неверные результаты. Было бы желание.
Re: Ссылочные типы, присваивания, Box/Unbox, куча, стек
От: Dr_Sh0ck Беларусь  
Дата: 28.05.03 05:19
Оценка:
Здравствуйте, vad_vadim, Вы писали:

_>нА экране получаем:

_>o = 123, o1 = 345
Потому, что здесь 345 приводится к object => боксится и o1 будет указывать на _другой_ объект.
Если мне не изменяет память, это особенность C#: нельзя изменить содержимое объекта в куче без анбоксинга/боксинга.


_>a.f = 2, b.f = 2 — ПОЧЕМУ ???

ну здесь-то понятно почему
Do not fake yourself ;)
ICQ#: 198114726
Re[2]: Ссылочные типы, присваивания, Box/Unbox, куча, стек
От: Dr_Sh0ck Беларусь  
Дата: 28.05.03 05:26
Оценка:
Здравствуйте, Dr_Sh0ck, Вы писали:

D_S>Если мне не изменяет память, это особенность C#: нельзя изменить содержимое объекта в куче без анбоксинга/боксинга.



Уточню: содержимое забокшенного объекта value-типа.
Do not fake yourself ;)
ICQ#: 198114726
Re[2]: Ссылочные типы, присваивания, Box/Unbox, куча, стек
От: vad_vadim Беларусь  
Дата: 28.05.03 06:14
Оценка:
Здравствуйте, Dr_Sh0ck, Вы писали:

_>>нА экране получаем:

_>>o = 123, o1 = 345
D_S>Потому, что здесь 345 приводится к object => боксится и o1 будет указывать на _другой_ объект.
----------------------
ПРО ЭТО Я И ПИСАЛ(!!!) в своих рассуждениях
------------------------

D_S>Если мне не изменяет память, это особенность C#: нельзя изменить содержимое объекта в куче без анбоксинга/боксинга.

----------------------------------------------
АГА(!!!) — вот тут то и вопрос!!!, вот почему я написал свои рассуждения после текста программы, которые доктор шок не прочитал по всей видимости.

----------------------------------------------
_>>a.f = 2, b.f = 2 — ПОЧЕМУ ???
D_S>ну здесь-то понятно почему
-------------------------------------------------------------
Вот здесь-то и непонятно было почему, доктор шок сам же написал:

D_S>Если мне не изменяет память, это особенность C#: нельзя изменить содержимое объекта в куче без анбоксинга/боксинга.


я тоже так вначале думал, поэтому и возник вопрос насчет a.f = 2, b.f = 2

но, потом рассуждая, я пришел к другому выводу (все-таки прошу прочитать мои рассуждения) и что бы подтвердить мои догадки или наоборот, опровергнуть их, и вынес вопрос на форум
Успешные люди ориентируются на достижение побед, неудачники — на избегание неудач
Re[3]: Ссылочные типы, присваивания, Box/Unbox, куча, стек
От: Dr_Sh0ck Беларусь  
Дата: 28.05.03 07:06
Оценка:
Здравствуйте, vad_vadim, Вы писали:

_>----------------------------------------------

_>>>a.f = 2, b.f = 2 — ПОЧЕМУ ???
D_S>>ну здесь-то понятно почему
_>-------------------------------------------------------------
_>Вот здесь-то и непонятно было почему, доктор шок сам же написал:

D_S>>Если мне не изменяет память, это особенность C#: нельзя изменить содержимое объекта в куче без анбоксинга/боксинга.


Читай уточнение в следующем за прочитанным тобой постингом.
345 — это value-type со всеми вытекающими.
Переменные же а и b — экземпляры reference type.
Do not fake yourself ;)
ICQ#: 198114726
Re[3]: Ссылочные типы, присваивания, Box/Unbox, куча, стек
От: Dr_Sh0ck Беларусь  
Дата: 28.05.03 07:22
Оценка:
Здравствуйте, vad_vadim, Вы писали:

_>но, потом рассуждая, я пришел к другому выводу (все-таки прошу прочитать мои рассуждения) и что бы подтвердить мои догадки или наоборот, опровергнуть их, и вынес вопрос на форум


Это по сути два разных случая.
int i = 123;
object o = i;
object o1 = o; //o1 и o указывают на один и тот же объект
o1 = 345; //а вот тут уже создается новый объект и его адрес заноситься в o1 => o и o1 указывают 
             //на разные объекты

Simple a = new Simple();
a.f = 1;
Simple b = a; //a и b указывают на один и тот же объект
a.f = 2;

В первом случае ты в o1 заносишь адрес нового объекта, а во втором — меняешь состояние
(в данном случае — переменную f) объета, на который существует две ссылки — a и b.

Это практически то же, что ты и написал в своих рассуждениях.
Do not fake yourself ;)
ICQ#: 198114726
Re: Ссылочные типы, присваивания, Box/Unbox, куча, стек
От: Tom Россия http://www.RSDN.ru
Дата: 28.05.03 07:26
Оценка: 2 (1)
Здравствуйте, vad_vadim, Вы писали:

VV>Есть примерчик:


VV>

VV>
VV>using System; 
VV>namespace Qwer 
VV>{ 
VV>class Simple
VV>{ 
VV>public int f; 
VV>} 
VV>class Test
VV>{ 
VV>public static void Main() 
VV>{ 
VV>int i = 123; 
VV>object o = i; 
VV>object o1 = o; 
VV>o1 = 345; 
VV>Console.WriteLine("o = {0}, o1 = {1}", o, o1); 

VV>Simple a = new Simple(); 
VV>a.f = 1; 
VV>Sample b = a; 
VV>a.f = 2; 
VV>Console.WriteLine("a.f = {0}, b.f = {1}", a.f, b.f); 
VV>Console.ReadLine(); 
VV>} 
VV>} 
VV>} 
VV>


VV>нА экране получаем:

VV>o = 123, o1 = 345
VV>a.f = 2, b.f = 2 — ПОЧЕМУ ???

VV>

VV>----------------------------------------
VV> При присваивании i к о создается объект в куче, который и содержит значение 123
Да. Теперь o указывает на обьект на куче, содержащий 123.

VV> Когда мы присвоили о1 = о — мы скопировали адрес ссылки и теперь о1 указывает на тот же объект, что и о

Всё правильно. Теперь и o и o1 ссылаються на один и тот же обьект на куче.

VV> о1 = 345 — 345 неявно приводится к оbject, то есть в куче создается объект, который содержит значение 345, значит о1 будет указывать на ДРУГОЙ объект в куче

Всё правильно. o1 теперь указывает на другой обьект.

VV> когда мы b=a, соответственно b тоже указывает на тот же объект в куче, что и а

Да. Именно так.

VV> когда мы a.f = 2 — так как f — имеет тип int и присваивается ему тоже тип целый, то нового объекта в куче не создается и соответственно объекты a, b продолжают указывать на один и тот же объект в куче и поэтому на экране получаем такие результаты. . .

Да.

VV> ПРАВ ЛИ Я В СВОИХ РАССУЖДЕНИЯХ ?

ДА.

VV> И есть ли вариант, что рассуждая таким образом я получу неверные результаты?

Тут я тебя не понял. Вообще то то о чём ты говоришь — работа компилятора. Он сам определяет то ли присваивается поле обьекта на куче, то ли производиться боксинг.
... << RSDN@Home 1.0 beta 6a >>
Народная мудрось
всем все никому ничего(с).
Re: Ссылочные типы, присваивания, Box/Unbox, куча, стек
От: mihailik Украина  
Дата: 28.05.03 12:26
Оценка: 2 (1) +1
_>нА экране получаем:
_>o = 123, o1 = 345
_>a.f = 2, b.f = 2 — ПОЧЕМУ ???


_> о1 = 345 — 345 неявно приводится к оbject, то есть в куче создается объект, который содержит значение 345, значит о1 будет указывать на ДРУГОЙ объект в куче


Конечно.

_> когда мы b=a, соответственно b тоже указывает на тот же объект в куче, что и а

_> когда мы a.f = 2 — так как f — имеет тип int и присваивается ему тоже тип целый, то нового объекта в куче не создается и соответственно объекты a, b продолжают указывать на один и тот же объект в куче и поэтому на экране получаем такие результаты. . .

Здесь ты намутил. По фигу, какой тип f. Поставь там тоже object — и ничего не изменится. Важно то, что ты не меняешь значение переменной a или b, а меняешь поле внутри общего объекта, на который обе они ссылаются.

_> ПРАВ ЛИ Я В СВОИХ РАССУЖДЕНИЯХ ?

_> И есть ли вариант, что рассуждая таким образом я получу неверные результаты?

А ты меньше рассуждай. Тут надо не мозги тренировать, а печень. Печенью нужно чувствовать. Вот ты удивляешься, "ПОЧЕМУ?" Плохой знак, тренируй печень.

Книжки Рихтера, кстати, по-моему больше для мозгов. Поэтому я на них и гоню — методологически вредно для подрастающего поколения.
... << RSDN@Home 1.0 beta 7a >>
Re[2]: Ссылочные типы, присваивания, Box/Unbox, куча, стек
От: vad_vadim Беларусь  
Дата: 28.05.03 13:06
Оценка: 6 (1)
Здравствуйте, mihailik, Вы писали:

_>> когда мы b=a, соответственно b тоже указывает на тот же объект в куче, что и а

_>> когда мы a.f = 2 — так как f — имеет тип int и присваивается ему тоже тип целый, то нового объекта в куче не создается и соответственно объекты a, b продолжают указывать на один и тот же объект в куче и поэтому на экране получаем такие результаты. . .

M>Здесь ты намутил. По фигу, какой тип f. Поставь там тоже object — и ничего не изменится. .


Проверил, действительно, добавив еще одно поле типа object, программа продолжала так же работать

M>Важно то, что ты не меняешь значение переменной a или b, а меняешь поле внутри общего объекта, на который обе они ссылаются


Самая важная инфа, которую я здесь узнал

_>> ПРАВ ЛИ Я В СВОИХ РАССУЖДЕНИЯХ ?

_>> И есть ли вариант, что рассуждая таким образом я получу неверные результаты?

M>А ты меньше рассуждай. Тут надо не мозги тренировать, а печень. Печенью нужно чувствовать. Вот ты удивляешься, "ПОЧЕМУ?" Плохой знак, тренируй печень.


M>Книжки Рихтера, кстати, по-моему больше для мозгов. Поэтому я на них и гоню — методологически вредно для подрастающего поколения.



А здесь не согласен !
То, что я хочу досконально, по крайней мере хотя бы попытаться, разобраться — это плохо!
Лучше, конечно, "попрыгать" по верхам, а потом, делая серьезный проект, думать — а чего это ничего не работает, вроде все правильно, грамотно систему спроектировал, все продумал, синтаксических ошибок нет(компилятор их выловил) — а ни хрена не работает ! ! !
Смотреть в книгу и видеть фигу.
На якобы мелочах можно "засыпаться" и конкретно . . .
Успешные люди ориентируются на достижение побед, неудачники — на избегание неудач
Re[3]: Ссылочные типы, присваивания, Box/Unbox, куча, стек
От: mihailik Украина  
Дата: 29.05.03 09:46
Оценка:
M>Книжки Рихтера, кстати, по-моему больше для мозгов. Поэтому я на них и гоню — методологически вредно для подрастающего поколения.

_> А здесь не согласен !

_> То, что я хочу досконально, по крайней мере хотя бы попытаться, разобраться — это плохо!

О.К.

Пожалуй, ты прав, досконально разбираться нужно.
... << RSDN@Home 1.0 beta 7a >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.