先看下面一段代码

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

使用接口更改已装箱的值类型中的字段相关推荐

  1. 使用接口改变已经装箱的值类型的字段

    使用接口改变已经装箱的值类型的字段. using System; using System.Collections.Generic; using System.Text; namespace App1 ...

  2. jsonpath:从庞大的接口返回结果(返回结果为字典类型)中取字段值

    从庞大的接口返回结果(返回结果为字典类型)中取字段值,返回结果是list s = {"ec": 0, "errcode": 0, "em": ...

  3. 函数式接口作为方法的返回值类型案例

    类似地,如果一个方法的返回值类型是一个函数式接口,那么就可以直接返回一个Lambda表达式.当需要通过一 个方法来获取一个java.util.Comparator 接口类型的对象作为排序器时,就可以调 ...

  4. mysql栏的范围外值,MySQL中各种字段的取值范围-数据库专栏,MySQL

    mysql中各种字段的取值范围过节回来,网站更新的第一篇文章. 看来我有必要在最近找到一位志同道合的同学一起来维护站点才行了----------------------tinyint -128 – 1 ...

  5. 第一行代码天气预报接口更改后JSON键值对的问题

    最近在使用第一行代码后面的天气时出现如下问题:发现的x3接口已经停止维护了,于是更换为v5接口. https://free-api.heweather.com/v5/weather?city=CN10 ...

  6. [CLR via C#]5.3 值类型的装箱和拆箱

    原文:[CLR via C#]5.3 值类型的装箱和拆箱 在CLR中为了将一个值类型转换成一个引用类型,要使用一个名为装箱的机制. 下面总结了对值类型的一个实例进行装箱操作时内部发生的事: 1)在托管 ...

  7. 第五章 基元类型,引用类型和值类型

    目录 5.1 编程语言的基元类型 5.2 引用类型和值类型 5.3 值类型的装箱和拆箱 5.4 对象哈希码 5.5 dynamic基元类型 5.1 编程语言的基元类型 编译器直接支持的数据类型称为基元 ...

  8. C#基础知识1-深入理解值类型和引用类型

    C#值类型和引用类型这个概念在刚学习的时候应该就知道了.但是我们并没有深入的去理解它.越是基础知识其实才是最有用的.对代码的优化,代码质量的提升都有帮助.通过整理本文章,对很多知识也起到了巩固的作用吧 ...

  9. 《CLR via C#》读书笔记 之 基元类型、引用类型和值类型

    第五章 基元类型.引用类型和值类型 2013-02-27 5.3 值类型的装箱和拆箱     5.3.2 对象的相等性和同一性 参考 ToDo: 什么时候使用值类型,什么时候使用引用类型 5.3 值类 ...

最新文章

  1. python什么时候用框架_Python 中三大框架各自的应用场景
  2. spring中关于aop拦截功能的记录
  3. 【干货】工作邮件高段位写法
  4. 新年快乐,送一台新款华为笔记本!
  5. 程序猿怎样的生活方式才能兼顾工作、家庭和自我提升
  6. Enabled AWE
  7. MySQL的Binlog与Redolog
  8. java 鱼刺图_鱼刺卡喉咙,喝醋、吃馒头吞饭有用吗?答案全在这
  9. 华三OSPF多区域配置实例
  10. win的反义词_趣味记忆—小学英语必须掌握的120组反义词
  11. 爬虫headers参数
  12. 【小Game】C++ - EGE - 躲避球小游戏
  13. Elasticsearch模块——CRUD
  14. 浏览器网页缩放对页面的影响
  15. Spring Security CSRF防御源码分析
  16. 快速学习Java8新特性第七讲——Optional类
  17. POJ 3104(二分算法,难难难)
  18. JAVA12_09学习总结(Java注解,JavaScript)
  19. os.system() 和os.popen()的区别
  20. 通过CND方式引入elementui,vue,vuex,vue-router

热门文章

  1. 自学前端两三个月,很迷茫,有大佬可以指导吗?
  2. JavaScript二进制、八进制和十六进制数值
  3. mysql中文版下载_mysql数据库下载
  4. modal组件 vue_开发一个简单的 Vue 弹窗组件
  5. 以下构成python循环结构的方法中正确的是_python教程:python循环结构
  6. 以后台服务的形式启动nodejs应用
  7. 注册表把html设置成桌面,[注册表] 将Windows 10默认应用程序设置页面添加到桌面右键菜单中...
  8. Linux学习笔记---使用MfgTool工具烧写自己的系统(二)
  9. STM8学习笔记---点亮LED灯
  10. 吴恩达深度学习4.4笔记_Convolutional Neural Networks_人脸识别和神经风格转换