public static void Main() { Point p = new Point(1, 1); //This call will box point p to an object so it can call the ToString method. Console.WriteLine(p); //This changes the unboxed value before reboxing it and printing it out. p.Change(2, 2); Console.WriteLine(p); //Casting the point as type object will still let it correctly print out. Object o = p; Console.WriteLine(o); ((Point) o).Change(3, 3); Console.WriteLine(o); Console.WriteLine(p); p.Change(2, 2); Console.WriteLine(p); Object o = p; Console.WriteLine(o); //This returns (2,2)! ((Point) o).Change(3, 3); Console.WriteLine(o); //The reason is that the Change method has to cast the *boxed* point to a Point //Which doesn't refer to the point being cast - it's instead a brand - new point! //But the Change method doesn't act on o, it acts on the new point! }
public static void Main(string[] args) { Point p = new Point(1, 1); Console.WriteLine(p); p.Change(2, 2); Console.WriteLine(p); Object o = p; Console.WriteLine(o); //PS Никак нельзя изменить поля в упакованном объекте* // Происходит распаковка в тип Point и вызов метода change // поля o копирутся во временный объект струтуры Point // но это не никак не влияеет на o и p ((Point)o).Change(3, 3); Console.WriteLine(o); /* *Есть возможность изменить поля упакованного объекта через интерфейс * Опеределим IChangeBoxedPoint с методом change * Реализуем в структуре этот метод * Ниже p упаковывается, соотв. соаздется объект в куче у которого мы изменяем поля 4 ,4 * Но он сразу же подхватывается сборщиком мусора, тк на этот объект никто не ссылается * ((IChangeBoxedPoint)p).Change(4,4) * Соотв. структуру p мы не изменили * След. пример * ((IChangeBoxedPoint)o).Change(5,5) * В этом примере никакая упаковка не происходит * Тем самым у упакованного объекта o изменяем поля на 5,5 * Получается что через интерфейсы можно менять поля упакованных объектов */ }
public static void Go() { Point p = new Point(1, 1); Console.WriteLine(p); p.Change(2, 2); Console.WriteLine(p); Object o = p; Console.WriteLine(o); ((Point)o).Change(3, 3);//!!!(2,2) Console.WriteLine(o); //C# can not change fields in packaged form, but //but you can apply the interface // Boxes p, changes the boxed object and discards it ((IChangeBoxedPoint)p).Change(4, 4); Console.WriteLine(p); // Changes the boxed object and shows it ((IChangeBoxedPoint)o).Change(5, 5); Console.WriteLine(o); }
public void ShouldNotchangeStructState() { var p1 = new Point(1, 1); p1.Change(2, 2); Object o = p1; var p2 = (Point)o; p2.Change(3, 3); Assert.AreNotEqual(p1, p2); Assert.AreEqual(o, p1); }
public static void ChangingBoxedValueFails() { Point point = new Point(); Console.WriteLine(point); // Point.ToString() -> (0, 0) point.Change(1, 5); Object boxedPoint = point; Console.WriteLine(boxedPoint); // Point.ToString() -> (1, 5) ((Point)boxedPoint).Change(2, 3); Console.WriteLine(point); // Point.ToString() -> (1, 5) Console.WriteLine(boxedPoint); // Point.ToString() -> (1, 5) }
public void Boxing_Test_1() { Point p = new Point(1, 1); Console.WriteLine(p);//1,1 p.Change(2, 2); Console.WriteLine(p);//2,2 object o = p; Console.Write(o);//2,2 ((Point)o).Change(3, 3); Console.WriteLine(o);//2,2 }
public static void Test3() { Point p = new Point(1, 1); Console.WriteLine(p); // 1,1 p.Change(2, 2); Console.WriteLine(p); // 2,2 Object o = p; Console.WriteLine(o); // 2,2 ((Point)o).Change(3, 3); Console.WriteLine(o); // 2,2 ((IChangeBoxedPoint)p).Change(4, 4); Console.WriteLine(p); // 2,2 ((IChangeBoxedPoint)o).Change(5, 5); Console.WriteLine(o); // 5,5 }
public static void RunAndExplore() { Point p = new Point(1, 1); Console.WriteLine(p); p.Change(2, 2); Console.WriteLine(p); Object o = p; Console.WriteLine(o); ((Point)o).Change(3, 3); Console.WriteLine(o); // Boxes p, changes the boxed object and discards it ((IChangeBoxedPoint)p).Change(4, 4); Console.WriteLine(p); // Changes the boxed object and shows it ((IChangeBoxedPoint)o).Change(5, 5); Console.WriteLine(o); Console.ReadKey(); }
public static void TestStructBoxingOperations() { Point p = new Point(1, 1); Assert.AreEqual("(1, 1)", p.ToString()); p.Change(2, 2); Assert.AreEqual("(2, 2)", p.ToString()); object o = p; Assert.AreEqual("(2, 2)", o.ToString()); ((Point)o).Change(3, 3); Assert.AreEqual("(2, 2)", o.ToString()); ((IChangeBoxedPoint)p).Change(4, 4); Assert.AreEqual("(2, 2)", p.ToString()); ((IChangeBoxedPoint)o).Change(5, 5); Assert.AreEqual("(5, 5)", o.ToString()); }
public static void Go() { Point p = new Point(1, 1); Console.WriteLine(p); p.Change(2, 2); Console.WriteLine(p); Object o = p; Console.WriteLine(o); ((Point)o).Change(3, 3); Console.WriteLine(o); // Boxes p, changes the boxed object and discards it ((IChangeBoxedPoint)p).Change(4, 4); Console.WriteLine(p); // Changes the boxed object and shows it ((IChangeBoxedPoint)o).Change(5, 5); Console.WriteLine(o); }
public virtual void VirtualDoSomethingConcrete(Point point) { point.Change(101, 101); }
public void DoSomethingConcrete(Point point) { point.Change(99, 99); }
public static void StaticDoSomethingConcrete(Point point) { point.Change(103, 103); }