class Test
{
interface IAddOne
{
int AddOne();
}
struct FixPoint : IAddOne
{
int _x;
public FixPoint(int x)
{
_x = x;
}
public int AddOne()
{
++_x;
return _x;
}
}
static void Main()
{
ArrayList pointList = new ArrayList(1);
FixPoint f = new FixPoint(0);
pointList.Add(f);
Console.Write(f.AddOne());
Console.Write(f.AddOne());
Console.Write(f.AddOne());
Console.WriteLine();
Console.WriteLine(pointList[0]);
Console.Write(((IAddOne)pointList[0]).AddOne());//值类型,保存在栈上
// Console.Write(((IAddOne)pointList[0]).AddOne()); //12345
//FixPoint p = (FixPoint)pointList[0];//引用类型,保存在受管制的堆上
//Console.Write(p.AddOne());
FixPoint p = (FixPoint)pointList[0];
Object obj = pointList[0];
Console.Write(p.AddOne());
Console.Write(p.AddOne());
Console.WriteLine(p.AddOne());
Console.WriteLine("next");
Console.Write(((IAddOne)pointList[0]).AddOne());
Console.Write(((IAddOne)pointList[0]).AddOne());
Console.Write(((FixPoint)pointList[0]).AddOne());
Console.Write(((FixPoint)pointList[0]).AddOne());
Console.Write(((FixPoint)pointList[0]).AddOne());
Console.Write(((FixPoint)pointList[0]).AddOne());
Console.Read(); }
}
123
ConsoleApplication1.Test+FixPoint
1234
next
2
2345555
详细介绍:http://topic.csdn.net/u/20111118/22/e119cef9-a5e7-4d8c-8bc8-bf747370e954.html
ArrayList pointList = new ArrayList(1);
FixPoint f = new FixPoint(0); // 此处引起装箱, f 和 pointList[0] 虽数据相同,却已经不是同一个对象了。
// f 指向的是 栈 中的对象,而 pointList[0] 却指向的是 堆中 被装箱的对象。
pointList.Add(f);
Console.Write(f.AddOne());
Console.Write(f.AddOne());
Console.Write(f.AddOne());
Console.WriteLine();
Console.WriteLine(pointList[0]); // 输出结果为FixPoint
Console.WriteLine(((FixPoint)pointList[0])._x); //输出为 0
Console.WriteLine(((IAddOne)pointList[0]).AddOne());//输出为 1 强制转换为 接口 ,不会导致拆箱
Console.WriteLine(((FixPoint)pointList[0]).AddOne());//输出为 2 强制转换为 stuuct ,会导致拆箱 ,修改的是复制到 栈 中的对象
FixPoint p = (FixPoint)pointList[0]; //拆箱发生复制 p和pointlist[0]没有关系了
Console.WriteLine(p.AddOne()); //输出为 2
Console.WriteLine(((FixPoint)pointList[0])._x); //输出为 1