您的位置:首页 > 编程语言 > C#

C# 禁止修改已装箱了的值类型的字段值,但是可以通过接口的方式实现

2016-07-18 17:57 627 查看
C# 默认是不能修改已装箱了的值类型中字段的值,但是可以通过 值类型实现指定的接口来改变

首先定义一个接口

interface IChange
{
void Change(int a, int b);
}


在定义值类型的类,实现以上接口

struct Point : IChange
{
private int x;
private int y;
public Point(int x,int y)
{
this.x = x;
this.y = y;
}

/// <summary>
/// 自己定义的方法
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
//public void Change(int a,int b)
//{
//    x = a;
//    y = b;
//}

/// <summary>
/// 实现接口的方法,用来实现 修改已装箱值类型的值
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
public void Change(int a, int b)
{
x = a;
y = b;
}
public override string ToString()
{
return string.Format("x:{0}, y:{1} ", x.ToString(), y.ToString());
}
}


最后,代码测试

static void Main(string[] args)
{

Point p1 = new Point(1, 1);
Console.WriteLine(p1);//1,1

p1.Change(2,2);
Console.WriteLine(p1);//2,2

object o = p1;
Console.WriteLine(o);//2,2

//** 1. 没有使用接口实现的时候,是不能直接修改已装箱 值类型中字段的值
//((Point)o).Change(3, 3);// (Point)o 生成临时的 point 存放在栈空间,跟 之前堆空间的 o 没有任何关系
//Console.WriteLine(o);//2,2

//** 2. 使用接口的方式,可以实现直接修改 已装箱 值类型中字段的值
((IChange)o).Change(3, 3);// 将对象o 强制转换成 接口 IChange 对象,由于都是引用类型,不会装箱,所以,调用接口的方法就可以修改值了
Console.WriteLine(o);//3,3

((IChange)p1).Change(3, 3);//
Console.WriteLine(p1);//2,2  输出值类型本身栈中的值

Console.Read();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: