при программировании важно понимать, что вызов метода, который принимает аргументы , подразумевает / включает / совпадает с присвоением значений этим аргументам .плюс:
static void Main(string[] args)
{
ValueType ObjVal = new ValueType(10);
ObjVal.Display();
ValueType.ReferenceType ObjValRef = new ValueType.ReferenceType(10);
ObjValRef.Display();
//call to Test(ObjVal, ObjValRef); replaced by the following 4 lines
ValueType v = ObjVal;
ReferenceType r = ObjValRef;
v.SValue = 50;
r.RValue = 50;
ObjVal.Display();
ObjValRef.Display();
Console.ReadKey();
}
должен дать тот же результат, что и ваш пример выше.когда вы объявляете ValueType v = ObjVal; , вы делаете копию фактического объекта структуры, что означает, что v является отдельным объектом все вместе.поэтому изменение значений его членов не повлияет на ObjVal.
однако, ReferenceType r = ObjValRef; делает копию ссылкой .Итак, теперь есть две ссылки, ObjValRef и r , указывающие на один и тот же объект.А именно объект, созданный при вызове new ValueType.ReferenceType (10);
, поэтому при изменении членов объекта указывало на по любой из этих двух ссылок, этот объектизменения, независимо от того, какой указатель используется для выполнения изменения.
о, согласно .. ссылка является просто адресом объекта.часто это 32-разрядное число, но оно меняется от языка к языку и от процессора к процессору.
и изменение эталонной копии само по себе, например, r = null; не будетвлияет на «оригинальную» ссылку ObjValRef, поскольку r является копией ObjValRef, а не самой ObjValRef.просто кажется, что они одинаковы, поскольку они оба указывают на один и тот же объект.
вы можете думать о реальном объекте как о месте (парк или какое-то известное здание, может быть, «парк белой горы»)и ссылки как уличные указатели, указывающие на это место.может быть много уличных указателей, указывающих на одно и то же место, но это не значит, что здесь много «белых горных парков».и это разница между типами значений и ссылочными типами.