博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[C#]struct如何支持虚方法覆盖和接口继承
阅读量:5740 次
发布时间:2019-06-18

本文共 1584 字,大约阅读时间需要 5 分钟。

  我还没有研读《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对象本身,这些虚方法退化成了静态调用(编译期绑定)。

转载于:https://www.cnblogs.com/cbscan/archive/2011/06/29/2092832.html

你可能感兴趣的文章
linux下使用过的命令总结(未整理完)
查看>>
时间助理 时之助
查看>>
英国征召前黑客组建“网络兵团”
查看>>
Silverlight 2.5D RPG游戏“.NET技术”技巧与特效处理:(十二)魔法系统
查看>>
PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)...
查看>>
pyjamas build AJAX apps in Python (like Google did for Java)
查看>>
LAMP环境搭建1-mysql5.5
查看>>
centos5.9使用RPM包搭建lamp平台
查看>>
Javascript String类的属性及方法
查看>>
[LeetCode] Merge Intervals
查看>>
SharePoint 读取 Site Columns 的数据并绑定到DropdownList
查看>>
使用 axios 详解
查看>>
IPA提交APPStore问题记录(一)
查看>>
快照产品体验优化
查看>>
ASCII
查看>>
Ubuntu 14.04 vsftp refusing to run with writable root inside chroot问题解决方法
查看>>
Intellij IDEA远程调试tomcat
查看>>
hadoop的学习论坛
查看>>
Struts2 学习小结
查看>>
烂泥:wordpress迁移到docker
查看>>