有关装箱的问题

有关装箱的一个小问题

 

看下面的例子:

 1namespace 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

    输出结果:3Sandwi.point

对象o输出的是Sandwi.point,而不是数值1。为什么呢?原因就是:

我们没有重写pointToString方法,所以对象o调用ObjectToString方法,返回的就是默认的全名啦。

如果要对象o输出数值1,只要重写struct pointToString方法即可。

  public struct point
    
{
        
public int x;
        
public override string ToString()
        
{
            
return x.ToString();
        }

    }


 

问题1:如果Point是个类,里面只有一个int属性,就会直接输出int属性的值.

Console.WriteLine(p.x+","+o.x);   

看下面的例子。




    从上面的例子可以看出,对象op的情况一无所知(不管p是结构还是类),对象o根本就不知道X的存在。当然,如果说再把o强制类型转换为point,就可以访问了,但是这样就违背了我的意图(如果point是值类型,那就是拆箱)。
    即使对p进行了装箱,把它变为一个对象。但是对象所属的类根本就没有定义point结构里的任何字段,所以它无法访问。
    为什么对象o完全不知道p,应该是编译器的问题吧。编译器把对象o当作Object类型,但是,在运行时,CLR知道对象o其实是point类型,不是Object类型。有点怪,但这也许就是CLR的类型安全吧。

posted on 2007-11-27 22:24  Sandwi  阅读(471)  评论(5编辑  收藏  举报

导航