use*_*291 4 .net c# inheritance
我们创建的所有类都继承自Object类,而无需显式声明该类的继承.
我的问题可能含糊不清,所以我会澄清:
我不是要求继承自Object以外的其他类,因为我知道禁止对类进行多重继承.我正在谈论继承而不是通过类接口,我的问题是关于隐含地做的不是用我自己的另一个类替换一个对象,或者用Object和我自己的另一个类做多重继承.我希望所有类都继承自Interface1OfMyOwn和Interface2OfMyOwn.
The*_*kis 11
所有类都隐式扩展,Object因为C#标准指定了语言.
询问他们如何实现这一点就像问他们如何实现void方法不返回数据的事实,或者他们如何实现类具有属性的事实:它只是在编译器的代码中的某处(这里可能是C#编译器)或JIT编译器).我们无法确切地知道,但是,如果编译器没有在类中检测到显式继承,那么它就变得System.Object简单了.所以你必须接受这Object只是编译器的一种特殊类型.
为什么你不能用自定义类做到这一点似乎显而易见:它会彻底混淆编译器是否应该扩展没有显式继承的类Object或你的自定义类.如果它为没有显式继承的每个类选择后者,那么在大多数情况下会引入编译错误,或者,如果你特别不走运,那么只会在运行时出现的令人惊讶的行为.如果它选择了前者而你必须明确选择你的课程,那有什么意义呢?
(当然,如果你想隐式实现一个接口,也会发生这种情况:所有没有真正实现该接口的类都会破坏并导致编译错误.或者,如果你运气不好,接口将匹配不相关的方法碰巧具有匹配签名并导致您通过测试找到的奇怪行为的类.)
这在运行时内的非常低级别受支持,值类型的值可以嵌入存储在垃圾收集堆中的对象中.因此,在引用类型中转换值类型并创建每个值类型从ValueType和Object继承的错觉.哪些是参考类型.
该机制在.NET中调用装箱,值类型值字面上被"装箱"到一个对象中.并且有一个拆箱转换,从带有盒装值的对象返回到值类型的值.C#编译器将根据您的源代码自动发出这些转换.有专门的操作码是IL,C#编译器从源代码中发出的中间语言.分别是Opcodes.Box和Opcodes.Unbox指令.Opcodes.Constrained是一个可以优化转换的指令.抖动知道如何实现它们并生成非常有效的内联机器代码来进行这些转换.
Boxing是System.Object的高度特定,它是类型层次结构中的基类,支持它的管道高度特定于值类型值.它不是可扩展的机制,您不能添加自己的IL指令也不能扩展抖动,也不能为C#语言提供新的语法.如果您需要类型具有公共基本接口或类,则必须在代码中以这种方式声明它们.该动态关键字可能会吸引你,它不是来自这个问题清楚了.
| 归档时间: |
|
| 查看次数: |
1273 次 |
| 最近记录: |