有关装箱的问题
有关装箱的一个小问题
看下面的例子:
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
16
public struct point
17
{
18
public int x;
19
}
20
}
21
namespace Sandwi2
{3
class Program4
{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

16
public struct point17
{18
public int x;19
}20
}21

输出结果:3,Sandwi.point
对象o输出的是Sandwi.point,而不是数值1。为什么呢?原因就是:
我们没有重写point的ToString方法,所以对象o调用Object的ToString方法,返回的就是默认的全名啦。
如果要对象o输出数值1,只要重写struct point的ToString方法即可。
public struct point
{
public int x;
public override string ToString()
{
return x.ToString();
}
}
问题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的类型安全吧。


浙公网安备 33010602011771号