a AS B 与 (B) a 以及 对引用存储方式的假想

    public class A
    {
        public 
void Methoda1() { Console.WriteLine("this is a method");}
    }
    public class B : A
    {
        public 
void Methodb1() { Console.WriteLine("this is b method");}
    }


    public class MyBace
    {

        public 
void AsMethod()
        {
            B b 
= new B();

            A a 
= b as A;//返回 A类型引用

            a.Methoda1();
            b.Methodb1(); 
//从b仍为B类型的引用

              
//a.Methodb1();a为A类型引用,不包含此方法




            a 
= (A)b;;//返回 A类型引用
            a.Methoda1();
            b.Methodb1(); 
//(A)b同样只是返回一个A类型引用,b引用本身不改变



            
//a.Methodb1();    a为A类型引用,不包含此方法




        }


    }

 

猜想

1   类型的方法地址是通过引用保存在栈中,所以当a=b as A 或者 a = (A)b后,引用a的栈中,只保存了A类型方法的地址.

所以a.Methodb1();无效

2   也不排除a引用中保存的是类型A的结构及实例入口地址,再从实例入口处找到相应方法的地址.

显然第一种设想比第二种少了到堆中查询方法地址的步骤,性能要好

当然1要保存方法地址,比较浪费栈的空间

posted on 2009-05-19 01:35  imbob  阅读(1644)  评论(6)    收藏  举报

导航