zoukankan      html  css  js  c++  java
  • 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         }
  • 相关阅读:
    轻量级javascript库不用写CSS3动画 Move.js
    ajax post 和 get方法详解
    HTML5 localStorage图书阅读器实例
    css3 监听webkitAnimationEnd运动结束 后执行什么
    设计模式四 工厂模式
    设计模式三 原型模式
    设计模式二 单例模式
    设计模式一 6大设计原则
    zookeeper 源码编译
    plantuml 基本语法(转摘)
  • 原文地址:https://www.cnblogs.com/yougmi/p/5682185.html
Copyright © 2011-2022 走看看