[C#]struct如何支持虚方法覆盖和接口继承

  我还没有研读《CLR Via C#》之类的专著,只是心里有了疑问,然后就去个人探究,下文多为猜想。更希望了解内幕的朋友告知C#后台真相。

  我自个儿琢磨出来的结论:形如 

 
  
1 // 原始声明
2 struct People : IFormattable
3 {
4 public string ToString( string format, IFormatProvider formatProvider)
5 {
6 return ToString();
7 }
8 public override string ToString() { return Name; }
9
10 public string Name { get ; set ; }
11 }

 的结构声明,会被转化为两个后台声明:

 
  
1 // 实际代码中的struct People 被映射成这个类型,虚方法声明和接口继承都无效了
2 struct PeoplePOD // : IFormattable
3 {
4 public string ToString( string format, IFormatProvider formatProvider)
5 {
6 return ToString();
7 }
8 public /* override */ string ToString() { return Name; }
9
10 public string Name { get ; set ; }
11 }
12 // 这是装箱后的堆对象类型,任何试图将原始struct转化为object/ValueType/接口的转型,都会被自动装箱为这个类型的对象
13 class PeopleBox : IFormattable
14 {
15 public string ToString( string format, IFormatProvider formatProvider)
16 {
17 return ToString();
18 }
19 public override string ToString() { return Name; }
20
21 public string Name { get ; set ; }
22 }

  代码中出现的所有struct People,其实都是struct PeoplePOD,即放弃了虚函数和接口继承后的纯数据+非虚方法。没有了虚方法,对象实例中就不需要为了支持多态而去包含指向类型信息的指针,故对这个struct取sizeof得到的大小等于各个字段(不包括class字段)sizeof大小之和。

  而任何将原始struct对象进行向基类的转换,都会造成装箱,装箱类型就是PeopleBox:

 
  
1 People orgin = new People();
2 object _object = orgin; // object _object = new PeopleBox(orgin);
3 ValueType _valueType = orgin; // ValueType _valueType = new PeopleBox(orgin);
4 IFormattable _iformattable = orgin; // IFormattable _iformattable = new PeopleBox(orgin);
  所以,在struct中声明的虚函数和接口继承,只在装箱后对象上完全发挥了效果,对于struct对象本身,这些虚方法退化成了静态调用(编译期绑定)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值