有关装箱的问题
有关装箱的一个小问题
看下面的例子:
1
namespace Sandwi
2
{
3
class Program
4
{
5
static void Main(string[] args)
6
{
7
point p = new point();
8
p.x = 1;
9
Object o = p;
10
p.x = 3;
11
Console.WriteLine(p.x+","+o);
12
Console.ReadLine();
13
}
14
}
15![](/Images/OutliningIndicators/InBlock.gif)
16
public struct point
17
{
18
public int x;
19
}
20
}
21![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](/Images/OutliningIndicators/InBlock.gif)
4
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/InBlock.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
14
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
20
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
21
![](/Images/OutliningIndicators/None.gif)
输出结果:3,Sandwi.point
对象o输出的是Sandwi.point,而不是数值1。为什么呢?原因就是:
我们没有重写point的ToString方法,所以对象o调用Object的ToString方法,返回的就是默认的全名啦。
如果要对象o输出数值1,只要重写struct point的ToString方法即可。
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
问题1:如果Point是个类,里面只有一个int属性,就会直接输出int属性的值.
Console.WriteLine(p.x+","+o.x);
看下面的例子。
从上面的例子可以看出,对象o对p的情况一无所知(不管p是结构还是类),对象o根本就不知道X的存在。当然,如果说再把o强制类型转换为point,就可以访问了,但是这样就违背了我的意图(如果point是值类型,那就是拆箱)。
即使对p进行了装箱,把它变为一个对象。但是对象所属的类根本就没有定义point结构里的任何字段,所以它无法访问。
为什么对象o完全不知道p,应该是编译器的问题吧。编译器把对象o当作Object类型,但是,在运行时,CLR知道对象o其实是point类型,不是Object类型。有点怪,但这也许就是CLR的类型安全吧。