关于ToString装箱拆箱

Struct A : ICloneable 
{ 
public Int32 x; 
public override String ToString() { 
return String.Format(”{0}”,x); 
} 
public object Clone() { 
return MemberwiseClone(); 
} 
} 
static void main() 
{ 
A a; 
a.x = 100; 
Console.WriteLine(a.ToString()); 
Console.WriteLine(a.GetType()); 
A a2 = (A)a.Clone(); 
ICloneable c = a2; 
Ojbect o = c.Clone(); 
} 

0:a.ToString()。编译器发现A重写了ToString方法,会直接调用ToString的指令。因为A是值类型,编译器不会出现多态行为。因此,直接调用,不装箱。(注:ToString是A的基类System.ValueType的方法)
1:a.GetType(),GetType是继承于System.ValueType的方法,要调用它,需要一个方法表指针,于是a将被装箱,从而生成方法表指针,调用基类的System.ValueType。(补一句,所有的值类型都是继承于System.ValueType的)。
2:a.Clone(),因为A实现了Clone方法,所以无需装箱。
3:ICloneable转型:当a2为转为接口类型时,必须装箱,因为接口是一种引用类型。
4:c.Clone()。无需装箱,在托管堆中对上一步已装箱的对象进行调用。
附:其实上面的基于一个根本的原理,因为未装箱的值类型没有方法表指针,所以,不能通过值类型来调用其上继承的虚方法。另外,接口类型是一个引用类型。对此,我的理解,该方法表指针类似C++的虚函数表指针,它是用来实现引用对象的多态机制的重要依据。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,637评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,533评论 19 139
  • 1. [C#语言基础]请简述拆箱和装箱。 答: 装箱操作: 值类型隐式转换为object类型或由此值类型实现的任何...
    胤醚貔貅阅读 4,978评论 1 28
  • 2017.11.26星期 日天气 晴 欣赏自己:非常感谢微商公社提供的学习平台,非常激动迈出了第一步来到此次的微商...
    慕容培训教练阅读 262评论 0 0
  • 现在已经康复可以活蹦乱跳的我回想当年被误诊的经历。 高三第二学期前夕,吃过午饭准备上学的我突然出现呕吐和腹泻,经过...
    我家的猫猫阅读 1,090评论 3 4

友情链接更多精彩内容