• 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         }
  • 相关阅读:
    [转帖]J2ME程序开发全方位基础讲解汇总
    IWAM账号密码不一致引起IIS无法处理ASP文件
    [存档]J2ME中随机数字处理全攻略
    利用计划任务和VBS脚本实现自动WEB共享文件夹里的文件
    完美解决Java程序在 MOTO E680i 中声音文件播放
    J2ME中使用pauseApp控制手机临时退出JAVA程序
    Web页中使用MediaPlayer
    严重注意MSSQL视图跨数据库复制的问题
    Java下数字类型的转换
    项目开发:电话留言软件(20050717)
  • 原文地址:https://www.cnblogs.com/yougmi/p/5682185.html
Copyright © 2020-2023  润新知