C# 禁止修改已装箱了的值类型的字段值,但是可以通过接口的方式实现
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# 禁止修改已装箱了的值类型的字段值,但是可以通过接口的方式实现相关推荐
- 使用接口改变已经装箱的值类型的字段
使用接口改变已经装箱的值类型的字段. using System; using System.Collections.Generic; using System.Text; namespace App1 ...
- C#值类型以及默认值记录下
C#的值类型有bool,byte,sbyte,decimal,double,float,int,uint,long,string等 如果我们擅长使用默认值,可以帮助我们减少带来赋值及代码编写. 比如我 ...
- Redis键命令(查找键、判断键值是否存在、查看键值类型、删除键值、设置过期时间、查看键值有效时间)
[键命令对于不同数据结构类型通用] 查找键,参数⽀持正则表达式 keys pattern 例2:查看名称中包含a的键 keys a* 判断键是否存在,如果存在返回1,不存在返回0 exists key ...
- 【SQL编程】MySQL 5.7.28 版本使用 SQL 直接解析 JSON 字符串(判断是否是合法JSON类型+文本深度+文本长度+值类型+keys获取+值获取+不同深度数据获取)
1. 版本说明 SELECT @@version; -- 5.6.35-log 不支持 JSON 解析相关函数 -- 5.7.28 支持 2. 测试代码 准备阶段 建表 CREATE TABLE `t ...
- oracle中修改字段类型,字段值不为空
字段有值的情况下,修改字段的类型,比如id为number类型修改为varchar2 alter table xyj_province_city_area rename column id to cit ...
- MySQL 使用 CONVERT 函数将 blob,longblob 等类型的字段值 转换成 字符串展示
一.现状(使用select * from 表名 直接查询:看不到blob类型字段的具体内容) 二.使用 CONVERT 关键字查看 三.CONVERT 语法学习 CONVERT(s USING cs) ...
- 使用接口更改已装箱的值类型中的字段
先看下面一段代码 namespace 使用接口更改已装箱值类型的字段 { //point是一个值类型internal struct Point{private Int32 m_x, m_y;publi ...
- [CLR via C#]5.3 值类型的装箱和拆箱
原文:[CLR via C#]5.3 值类型的装箱和拆箱 在CLR中为了将一个值类型转换成一个引用类型,要使用一个名为装箱的机制. 下面总结了对值类型的一个实例进行装箱操作时内部发生的事: 1)在托管 ...
- 读CLR via C#总结(4) 值类型的装箱和拆箱
值类型是比引用类型更"轻型"的一种类型,因为它们不作为对象在托管堆中分配,不会被垃圾回收,也不通过指针来引用.但在许多情况下,都需要获取对值类型的一个实例引用.为了将一个值类型转换 ...
最新文章
- 坚持的力量 第十五篇
- Linux上Core Dump文件的形成和分析
- 2021春季学期-创新设计与实践-Lesson4
- 20年老码农分享20条编程经验,你pick哪些?
- c# mvc html.beginform,asp.net-mvc – 使用Html.BeginForm()与自定义路由
- Servlet 生命周期介绍
- 【转】SAP S4 OP/Cloud 10个区别
- Jekyll报'Tag was never closed'错误
- 简单的MFC画正弦曲线
- day8-异常处理与网络编程
- 北京大学:“巍巍上庠 国运所系”北大为时代发展而歌(附历年高考各省投档线)...
- Lenet神经网络实现
- C小项目 简易英汉词典
- matlab 安装教程:matlab 2016a(matlab R2016a)
- 网工浓缩笔记以及考点(第七章 网络安全)
- eboot.php如何转成iso,如何转换成iso格式
- bzoj2037 Sue的小球(区间dp,考虑到对未来的贡献)
- VirtualBox导入虚拟机错误e_invalidarg (0x80070057) 使用管理员权限打开VirtualBox
- 直通车执行营销方式方法
- 微信公众号素材下载之java
热门文章
- C Primer Plus(三)
- KD-VLP:知识蒸馏和预训练还能这么结合?上科大IntelMSRA提出基于知识蒸馏的端到端多模态预训练模型...
- CVPR 2021 | 又好又快的视频异常检测,引入元学习的动态原型学习组件
- Re-attention机制Transformer,实现强大性能
- 神经网络初始化trick:大神何凯明教你如何训练网络!
- Magento用的哪个php框架,初识magento框架代码目录
- jav中什么是组织java程序_Java程序的执行过程中用到一套JDK工具,其中javaprof.exe是指()。A.Java调试器B.Java剖析工具C.Jav...
- 公开课精华 | 移动机器人视觉三维感知的现在与将来
- python__画图表可参考(转自:寒小阳 逻辑回归应用之Kaggle泰坦尼克之灾)
- 手机端开发深度学习应用