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         }

 

posted @ 2016-07-18 17:57  Young汨  阅读(326)  评论(0编辑  收藏  举报