值类型如何实现引用类型我遇到了一个场景,值类型正在实现引用类型。类型。只是想知道这怎么可能(幕后是什么?)struct是一个值类型而interface是ref。类型但结构可以毫无错误地实现接口......有什么想法吗?在此先感谢实际上,它是同时以两种不同的方式完成的。首先,任何值类型都可以适合引用类型的对象实例。这个盒子是由运行时按需发明的,并将以您期望的方式实现接口——即盒子将实现值类型实现的任何接口。但是,CLI也允许“受限调用”。约束调用将虚拟调用转换为静态调用,但前提是值类型通过覆盖或接口实现实现实例方法(否则它由JIT作为虚拟调用实现)。泛型尤其广泛使用了受限调用(正是出于这个原因,在泛型中添加了受限操作码)。接口不是引用类型,它只是类型实现方式的约定。但是,接口类型的变量必须是引用,因为实现接口的类型可以是引用类型。接口类型的变量必须能够容纳引用类型或值类型,因为两者都可以实现接口。可以装箱值类型以便它获得引用,但不能将引用类型“扁平化”为值。尽管我们都使用Type一词来指代接口,但实际上,即使MSDN文档将接口描述为引用类型,接口也不是与任何其他引用类型或任何值类型相同意义上的类型。从某种意义上说,它根本不是一种类型。它是一个类型必须包含的行为契约(一组方法、属性和事件),声明它实现了该接口。publicinterfaceITestInterface{}publicclassMyClass:ITestInterface{}ITestInterfacem=newMyClass()asITestInterface;vart=m.GetType();您会看到,即使变量m被声明为ITestInterface类型,类型变量t仍然是MyClass。因此,尽管出于历史原因我们使用类型一词来表示接口,但接口的“类型”与具体对象的类型是截然不同的,具体对象是类或结构的实例。引用DonBox的Essential.NetCLR处理对象和接口类型的方式与其前身(C++和COM)不同。在C++和COM中,给定的具体类型对于每个基类型或支持的接口都有一个方法表。相反,CLR中给定的具体类型只有一个方法表。通过推断,一个基于CLR的对象只有一个类型句柄。这与C++和COM形成鲜明对比,在C++和COM中,对象通常每个基本类型或接口都有一个vptr。因此,CLR的castclass不会像C++的dynamic_cast或COM的查询接口那样产生第二个指针值。阅读本文很明显,接口本身永远不会有vptr表或CORINFO_CLASS_STRUCT,因为只有真正的具体对象(引用和值类型)才有。该结构由CLR为在运行时通过执行代码加载的每个类型创建和维护。此外,在Essential.Net中,CORINFO_CLASS_STRUCT包含指向两个表的指针,这些表描述了该类型支持的所有接口。isinst和castclass[CLR]操作码使用其中一个表来确定一个类型是否支持给定的接口。这些表中的第二个是CLR在调度针对基于接口的对象引用进行的虚拟方法调用时使用的接口偏移表。从这些引用中可以清楚地看出,接口与引用类型(类)或值类型(结构)根本不同。在.Net中实例化或使用的每个对象(引用类型)或值类型都必须是类或结构的具体实例。CLR加载的每个对象或结构都引用为该类或结构的具体类型创建的单个CORINFO_CLASS_STRUCT。接口是定义的类型类别,以保证在该类别中声明的任何类或结构(声明为实现该接口)必须包含声明的每个成员的类型成员(方法、属性、事件等)。接口定义。接口不是类和结构意义上的类型!接口本身并不存在;所以它们既不是引用类型也不是值类型。您可以为引用指定null。但是,如果实现者类型是值类型,当您将该类型的变量赋值给另一种类型时,它的行为就像值类型。所以它的行为就像引用类型的引用类型。类和结构是数据(代码)的类型,而接口是类型的类型。它们可用于对其他类型进行分类。他们强制其他类型遵循协议,仅此而已。它们只是一个布局、一个定义、一个契约;不存在的东西。以上就是C#学习教程的全部内容:值类型如何实现ref类型共享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
