C# 默认是不能修改已装箱了的值类型中字段的值,但是可以通过 值类型实现指定的接口来改变

首先定义一个接口

1     interface IChange
2     {
3         void Change(int a, int b);
4     }

在定义值类型的类,实现以上接口

 1     struct Point : IChange
 2     {
 3         private int x;
 4         private int y;
 5         public Point(int x,int y)
 6         {
 7             this.x = x;
 8             this.y = y;
 9         }
10
11         /// <summary>
12         /// 自己定义的方法
13         /// </summary>
14         /// <param name="a"></param>
15         /// <param name="b"></param>
16         //public void Change(int a,int b)
17         //{
18         //    x = a;
19         //    y = b;
20         //}
21
22         /// <summary>
23         /// 实现接口的方法,用来实现 修改已装箱值类型的值
24         /// </summary>
25         /// <param name="a"></param>
26         /// <param name="b"></param>
27         public void Change(int a, int b)
28         {
29             x = a;
30             y = b;
31         }
32         public override string ToString()
33         {
34             return string.Format("x:{0}, y:{1} ", x.ToString(), y.ToString());
35         }
36     }

最后,代码测试

 1         static void Main(string[] args)
 2         {
 3
 4             Point p1 = new Point(1, 1);
 5             Console.WriteLine(p1);//1,1
 6
 7             p1.Change(2,2);
 8             Console.WriteLine(p1);//2,2
 9
10             object o = p1;
11             Console.WriteLine(o);//2,2
12
13             //** 1. 没有使用接口实现的时候,是不能直接修改已装箱 值类型中字段的值
14             //((Point)o).Change(3, 3);// (Point)o 生成临时的 point 存放在栈空间,跟 之前堆空间的 o 没有任何关系
15             //Console.WriteLine(o);//2,2
16
17             //** 2. 使用接口的方式,可以实现直接修改 已装箱 值类型中字段的值
18             ((IChange)o).Change(3, 3);// 将对象o 强制转换成 接口 IChange 对象,由于都是引用类型,不会装箱,所以,调用接口的方法就可以修改值了
19             Console.WriteLine(o);//3,3
20
21             ((IChange)p1).Change(3, 3);//
22             Console.WriteLine(p1);//2,2  输出值类型本身栈中的值
23
24             Console.Read();
25         }

转载于:https://www.cnblogs.com/yougmi/p/5682185.html

C# 禁止修改已装箱了的值类型的字段值,但是可以通过接口的方式实现相关推荐

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

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

  2. C#值类型以及默认值记录下

    C#的值类型有bool,byte,sbyte,decimal,double,float,int,uint,long,string等 如果我们擅长使用默认值,可以帮助我们减少带来赋值及代码编写. 比如我 ...

  3. Redis键命令(查找键、判断键值是否存在、查看键值类型、删除键值、设置过期时间、查看键值有效时间)

    [键命令对于不同数据结构类型通用] 查找键,参数⽀持正则表达式 keys pattern 例2:查看名称中包含a的键 keys a* 判断键是否存在,如果存在返回1,不存在返回0 exists key ...

  4. 【SQL编程】MySQL 5.7.28 版本使用 SQL 直接解析 JSON 字符串(判断是否是合法JSON类型+文本深度+文本长度+值类型+keys获取+值获取+不同深度数据获取)

    1. 版本说明 SELECT @@version; -- 5.6.35-log 不支持 JSON 解析相关函数 -- 5.7.28 支持 2. 测试代码 准备阶段 建表 CREATE TABLE `t ...

  5. oracle中修改字段类型,字段值不为空

    字段有值的情况下,修改字段的类型,比如id为number类型修改为varchar2 alter table xyj_province_city_area rename column id to cit ...

  6. MySQL 使用 CONVERT 函数将 blob,longblob 等类型的字段值 转换成 字符串展示

    一.现状(使用select * from 表名 直接查询:看不到blob类型字段的具体内容) 二.使用 CONVERT 关键字查看 三.CONVERT 语法学习 CONVERT(s USING cs) ...

  7. 使用接口更改已装箱的值类型中的字段

    先看下面一段代码 namespace 使用接口更改已装箱值类型的字段 { //point是一个值类型internal struct Point{private Int32 m_x, m_y;publi ...

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

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

  9. 读CLR via C#总结(4) 值类型的装箱和拆箱

    值类型是比引用类型更"轻型"的一种类型,因为它们不作为对象在托管堆中分配,不会被垃圾回收,也不通过指针来引用.但在许多情况下,都需要获取对值类型的一个实例引用.为了将一个值类型转换 ...

最新文章

  1. 坚持的力量 第十五篇
  2. Linux上Core Dump文件的形成和分析
  3. 2021春季学期-创新设计与实践-Lesson4
  4. 20年老码农分享20条编程经验,你pick哪些?
  5. c# mvc html.beginform,asp.net-mvc – 使用Html.BeginForm()与自定义路由
  6. Servlet 生命周期介绍
  7. 【转】SAP S4 OP/Cloud 10个区别
  8. Jekyll报'Tag was never closed'错误
  9. 简单的MFC画正弦曲线
  10. day8-异常处理与网络编程
  11. 北京大学:“巍巍上庠 国运所系”北大为时代发展而歌(附历年高考各省投档线)...
  12. Lenet神经网络实现
  13. C小项目 简易英汉词典
  14. matlab 安装教程:matlab 2016a(matlab R2016a)
  15. 网工浓缩笔记以及考点(第七章 网络安全)
  16. eboot.php如何转成iso,如何转换成iso格式
  17. bzoj2037 Sue的小球(区间dp,考虑到对未来的贡献)
  18. VirtualBox导入虚拟机错误e_invalidarg (0x80070057) 使用管理员权限打开VirtualBox
  19. 直通车执行营销方式方法
  20. 微信公众号素材下载之java

热门文章

  1. C Primer Plus(三)
  2. KD-VLP:知识蒸馏和预训练还能这么结合?上科大IntelMSRA提出基于知识蒸馏的端到端多模态预训练模型...
  3. CVPR 2021 | 又好又快的视频异常检测,引入元学习的动态原型学习组件
  4. Re-attention机制Transformer,实现强大性能
  5. 神经网络初始化trick:大神何凯明教你如何训练网络!
  6. Magento用的哪个php框架,初识magento框架代码目录
  7. jav中什么是组织java程序_Java程序的执行过程中用到一套JDK工具,其中javaprof.exe是指()。A.Java调试器B.Java剖析工具C.Jav...
  8. 公开课精华 | 移动机器人视觉三维感知的现在与将来
  9. python__画图表可参考(转自:寒小阳 逻辑回归应用之Kaggle泰坦尼克之灾)
  10. 手机端开发深度学习应用