Beispiel #1
0
   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!
   }
Beispiel #2
0
        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
             * Получается что через интерфейсы можно менять поля упакованных объектов
             */
        }
Beispiel #3
0
            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);
        }
Beispiel #5
0
        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)
        }
Beispiel #6
0
        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
        }
Beispiel #8
0
        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();
        }
Beispiel #9
0
        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);
      }
Beispiel #11
0
 public virtual void VirtualDoSomethingConcrete(Point point)
 {
     point.Change(101, 101);
 }
Beispiel #12
0
 public void DoSomethingConcrete(Point point)
 {
     point.Change(99, 99);
 }
Beispiel #13
0
 public static void StaticDoSomethingConcrete(Point point)
 {
     point.Change(103, 103);
 }