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类型引用,不包含此方法
}
}
{
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要保存方法地址,比较浪费栈的空间
版权声明:本文原创发表于 博客园,作者为 imbob,博客 http://imbob.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。