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 }