博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用接口更改已装箱的值类型中的字段
阅读量:5158 次
发布时间:2019-06-13

本文共 3096 字,大约阅读时间需要 10 分钟。

先看下面一段代码

namespace 使用接口更改已装箱值类型的字段{     //point是一个值类型    internal struct Point    {        private Int32 m_x, m_y;        public Point(Int32 x, Int32 y)        {            m_x = x;            m_y = y;        }        public void Change(int x, int y)        {            m_x = x;            m_y = y;        }        public override string ToString()        {            return string.Format("({0},{1})", m_x, m_y);            //fromat返回指定字符串中一个或多个格式项替换为指定对象的字符串格式        }        class Program    {               }        static void Main(string[] args)        {

        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)
        Console.ReadKey();

}    }}

  Main在栈上创建一个Point值类型对象并赋值(1,1),第一次调用writeline之前对p进行装箱,writeline会在已装箱的Point上调用ToString,像预期中结果为(1,1)

     p调用Change方法将数值改为2,第二次调用writeline时再次对p进行装箱,像预期结果为(2,2)

     现在p要进行第三次装箱,o将引用已装箱的Point对象,第三次调用writeline会显示(2,2)

  最后希望调用Change来更改已装箱的Point对象中的字段,但是Object o 对Change方法并不知情所以要先将o转型为Point。将o转型为Point要先将o拆箱,并将已装箱中的字段

复制到线程栈上一个临时的Point中。这个临时的Point的m_x,m_y会变成3,3,但是已装箱的Point不受这个Change调用影响,所以第四次显示(2,2)

 

用接口来更改已装箱值类型的字段

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 使用接口更改已装箱值类型的字段{    //接口定义一个Change方法    internal interface IChageBoxedPoint    {        void Change(int x, int y);    }    //point是一个值类型    internal struct Point: IChageBoxedPoint    {        private Int32 m_x, m_y;        public Point(Int32 x, Int32 y)        {            m_x = x;            m_y = y;        }        public void Change(int x, int y)        {            m_x = x;            m_y = y;        }        public override string ToString()        {            return string.Format("({0},{1})", m_x, m_y);            //fromat返回指定字符串中一个或多个格式项替换为指定对象的字符串格式        }        class Program    {               }        static void Main(string[] args)        {            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)            //对p进行装箱,更改已装箱的对象,然后丢弃它;            ((IChageBoxedPoint)p).Change(4, 4);            Console.WriteLine(p);//显示(2,2)      //更改已装箱的对象病显示他            ((IChageBoxedPoint)o).Change(5,5);            Console.WriteLine(o);//显示(5,5)         }    }}

  

   这段代码与上边的主要区别是change方法由

IChageBoxedPoint接口定义,Point类型实现了这个接口。
//对p进行装箱,更改已装箱的对象,然后丢弃它;            ((IChageBoxedPoint)p).Change(4, 4);            Console.WriteLine(p);//显示(2,2)
这里未装箱的Point p 转型为IChangeBoxedPoint,这个转型造成对p的值进行装箱,然后已装箱的值上调用Change,这确实让m_x,m_y变成了4,4, 但是,在Change返回之后,已装箱的对象立即装备好进行垃圾回收,所以显示(2,2) 最后的例子中,o引用已装箱Point要转型为一个IChageBoxedPoint。这里不需要进行装箱,因为o已经是一个装箱的Point。然后调用Change,他能正确 修改已装箱的Point的m_x,m_y字段。接口方法允许更改一个已装箱的Point对象中的字段。

转载于:https://www.cnblogs.com/lanrenqilanming/p/6265426.html

你可能感兴趣的文章
约瑟夫问题
查看>>
Arduino 报错总结
查看>>
树莓派Android Things物联网开发:树莓派GPIO引脚图
查看>>
矩阵快速幂---BestCoder Round#8 1002
查看>>
如何将应用完美迁移至Android P版本
查看>>
【转】清空mysql一个库中的所有表的数据
查看>>
基于wxPython的python代码统计工具
查看>>
淘宝JAVA中间件Diamond详解(一)---简介&快速使用
查看>>
Hadoop HBase概念学习系列之HBase里的宽表设计概念(表设计)(二十七)
查看>>
Kettle学习系列之Kettle能做什么?(三)
查看>>
Day03:Selenium,BeautifulSoup4
查看>>
awk变量
查看>>
mysql_对于DQL 的简单举例
查看>>
35. Search Insert Position(C++)
查看>>
[毕业生的商业软件开发之路]C#异常处理
查看>>
一些php文件函数
查看>>
有关快速幂取模
查看>>
Linux运维必备工具
查看>>
字符串的查找删除
查看>>
NOI2018垫底记
查看>>