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