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 продолжают указывать на один и тот же объект в куче и поэтому на экране получаем такие результаты. . .
ПРАВ ЛИ Я В СВОИХ РАССУЖДЕНИЯХ ?
И есть ли вариант, что рассуждая таким образом я получу неверные результаты?
Успешные люди ориентируются на достижение побед, неудачники — на избегание неудач
Здравствуйте, vad_vadim, Вы писали:
_>нА экране получаем: _>o = 123, o1 = 345
Потому, что здесь 345 приводится к object => боксится и o1 будет указывать на _другой_ объект.
Если мне не изменяет память, это особенность C#: нельзя изменить содержимое объекта в куче без анбоксинга/боксинга.
_>a.f = 2, b.f = 2 — ПОЧЕМУ ???
ну здесь-то понятно почему
Здравствуйте, Dr_Sh0ck, Вы писали:
D_S>Если мне не изменяет память, это особенность C#: нельзя изменить содержимое объекта в куче без анбоксинга/боксинга.
Уточню: содержимое забокшенного объекта value-типа.
Здравствуйте, 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
но, потом рассуждая, я пришел к другому выводу (все-таки прошу прочитать мои рассуждения) и что бы подтвердить мои догадки или наоборот, опровергнуть их, и вынес вопрос на форум
Успешные люди ориентируются на достижение побед, неудачники — на избегание неудач
Здравствуйте, vad_vadim, Вы писали:
_>---------------------------------------------- _>>>a.f = 2, b.f = 2 — ПОЧЕМУ ??? D_S>>ну здесь-то понятно почему _>------------------------------------------------------------- _>Вот здесь-то и непонятно было почему, доктор шок сам же написал:
D_S>>Если мне не изменяет память, это особенность C#: нельзя изменить содержимое объекта в куче без анбоксинга/боксинга.
Читай уточнение в следующем за прочитанным тобой постингом.
345 — это value-type со всеми вытекающими.
Переменные же а и b — экземпляры reference type.
Здравствуйте, 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.
Это практически то же, что ты и написал в своих рассуждениях.
Здравствуйте, 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> И есть ли вариант, что рассуждая таким образом я получу неверные результаты?
Тут я тебя не понял. Вообще то то о чём ты говоришь — работа компилятора. Он сам определяет то ли присваивается поле обьекта на куче, то ли производиться боксинг.
_> о1 = 345 — 345 неявно приводится к оbject, то есть в куче создается объект, который содержит значение 345, значит о1 будет указывать на ДРУГОЙ объект в куче
Конечно.
_> когда мы b=a, соответственно b тоже указывает на тот же объект в куче, что и а _> когда мы a.f = 2 — так как f — имеет тип int и присваивается ему тоже тип целый, то нового объекта в куче не создается и соответственно объекты a, b продолжают указывать на один и тот же объект в куче и поэтому на экране получаем такие результаты. . .
Здесь ты намутил. По фигу, какой тип f. Поставь там тоже object — и ничего не изменится. Важно то, что ты не меняешь значение переменной a или b, а меняешь поле внутри общего объекта, на который обе они ссылаются.
_> ПРАВ ЛИ Я В СВОИХ РАССУЖДЕНИЯХ ? _> И есть ли вариант, что рассуждая таким образом я получу неверные результаты?
А ты меньше рассуждай. Тут надо не мозги тренировать, а печень. Печенью нужно чувствовать. Вот ты удивляешься, "ПОЧЕМУ?" Плохой знак, тренируй печень.
Книжки Рихтера, кстати, по-моему больше для мозгов. Поэтому я на них и гоню — методологически вредно для подрастающего поколения.
Здравствуйте, mihailik, Вы писали:
_>> когда мы b=a, соответственно b тоже указывает на тот же объект в куче, что и а _>> когда мы a.f = 2 — так как f — имеет тип int и присваивается ему тоже тип целый, то нового объекта в куче не создается и соответственно объекты a, b продолжают указывать на один и тот же объект в куче и поэтому на экране получаем такие результаты. . .
M>Здесь ты намутил. По фигу, какой тип f. Поставь там тоже object — и ничего не изменится. .
Проверил, действительно, добавив еще одно поле типа object, программа продолжала так же работать
M>Важно то, что ты не меняешь значение переменной a или b, а меняешь поле внутри общего объекта, на который обе они ссылаются
Самая важная инфа, которую я здесь узнал
_>> ПРАВ ЛИ Я В СВОИХ РАССУЖДЕНИЯХ ? _>> И есть ли вариант, что рассуждая таким образом я получу неверные результаты?
M>А ты меньше рассуждай. Тут надо не мозги тренировать, а печень. Печенью нужно чувствовать. Вот ты удивляешься, "ПОЧЕМУ?" Плохой знак, тренируй печень.
M>Книжки Рихтера, кстати, по-моему больше для мозгов. Поэтому я на них и гоню — методологически вредно для подрастающего поколения.
А здесь не согласен !
То, что я хочу досконально, по крайней мере хотя бы попытаться, разобраться — это плохо!
Лучше, конечно, "попрыгать" по верхам, а потом, делая серьезный проект, думать — а чего это ничего не работает, вроде все правильно, грамотно систему спроектировал, все продумал, синтаксических ошибок нет(компилятор их выловил) — а ни хрена не работает ! ! !
Смотреть в книгу и видеть фигу.
На якобы мелочах можно "засыпаться" и конкретно . . .
Успешные люди ориентируются на достижение побед, неудачники — на избегание неудач
M>Книжки Рихтера, кстати, по-моему больше для мозгов. Поэтому я на них и гоню — методологически вредно для подрастающего поколения.
_> А здесь не согласен ! _> То, что я хочу досконально, по крайней мере хотя бы попытаться, разобраться — это плохо!