Ссылочные типы, присваивания, 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 продолжают указывать на один и тот же объект в куче и поэтому на экране получаем такие результаты. . .
ПРАВ ЛИ Я В СВОИХ РАССУЖДЕНИЯХ ?
И есть ли вариант, что рассуждая таким образом я получу неверные результаты?
Успешные люди ориентируются на достижение побед, неудачники — на избегание неудач
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.