所有值类型继承自System.ValueType的疑惑

  比如说int吧,是值类型,是个struct,是这样声明的

  public struct Int32 : IComparable, IFormattable, IConvertible, IComparable, IEquatable

  哪能看出来继承自ValueType?? 再说struct不是不能继承吗?为什么说继承自ValueType??不解。。。。

  回答:

  ValueType的确是类类型,但是他的子类却是值类型,这是因为CLR对他的子类经过了特殊的处理.CLR若判断某类继承自ValueType,那么会在内存分配方面使它具有值类型的特征(例如直接分配在栈上),这和类库的继承层次结构并无多大关系。

  C#这边的编译器也经过了特殊处理,使值类型在诸多方面不同于类类型,例如,我们不可以声明一个继承自ValueType的值类型等等.

  简单的说微软对.net中的值类型做了特殊处理使其继承自ValueType.注:语法上struct是不允许继承的,但可以实现接口.觉得微软挺恶心的.老搞一些和语法不符的东西.

  很多类型都没有显示的继承基类,.net默认为继承object,以string为例,只直接继承object的.

  struct是直接继承valuetype的,默认的,但struct有个特点,不能显示继承基类,即只能继承valuetype,所以就这样了.所以就像楼主看的一样了

  书上说不能继承基类了,是因为C#是单继承了,已经有这valuetype了,所以不能继承了

时间: 2024-10-29 01:08:46

所有值类型继承自System.ValueType的疑惑的相关文章

值类型与引用类型(中)

本文将介绍以下内容: 类型的基本概念  值类型深入 引用类型深入 值类型与引用类型的比较及应用    1. 引言 上回[第八回:品味类型---值类型与引用类型(上)-内存有理]的发布,受到大家的不少关注,我们从内存的角度了解了值类型和引用类型的所以然,留下的任务当然是如何应用类型的不同特点在系统设计.性能优化等方面发挥其作用.因此,本回是对上回有力的补充,同时应朋友的希望,我们尽力从内存调试的角度来着眼一些设计的分析,这样就有助于对这一主题进行透彻和全面的理解,当然这也是下一回的重点. 从内存角

浅谈C#中所谓的“值类型”

在C#中,相信大家对于 "值类型" 并不陌生,因为它在我们代码设计中是不可缺少的,那么究竟什么是 "值类型" 呢? "值类型"就是 我们用到的 Int16,Int32这些数值类型吗? 我们知道在C#中所有的类型继承于System.Object根类型,这也就意味着就代码层面来讲,在C#中所有的类型都是Class,,即一切都是Class类型,既然全部都是Class类型,那么值类型在哪里呢?我们可以发现在C#中System.Int16,System.I

[CLR via C#]5.2 引用类型和值类型

原文:[CLR via C#]5.2 引用类型和值类型 CLR支持两种类型:引用类型和值类型. 虽然FCL中大多数都是引用类型,但开发人员用的最多的还是值类型.引用类型总是在托管堆上分配的,C#的new操作符会返回对象的内存地址--也就是指向对象数据的内存地址. 使用引用类型必须注意到一些性能问题,首先考虑一下事实: 1)内存必须从托管堆上分配. 2)对上分配的每个对象都有一些额外的成员(比如前面提到过得"类型对象指针"和"同步块索引"),这些成员必须初始化. 3)

实例解析C++/CLI之值类型

值类型是一种轻量级的C++/CLI类机制,非常适合于小型的数据结构,且从语义的角度来看,与数值(Value)类似. 与之相比,引用类型的实例--包括那些声明在堆栈上的,是由垃圾回收器管理的,而值类型的实例却不是.一般来说,一个值类较好的实现应只有一些数据成员,而不需要继承性,这样,在函数传递及返回值.或是赋值操作时,不会带来巨大的数据开销. 值类初印像 请看例1中的Point类,可以通过替换ref为value,来把一个引用类变为值类:与引用类(ref)相似,值类(value)也是一个包含了空格的

值类型和引用类型的区别深入理解_实用技巧

区别: 1.值类型通常被分配在栈上,它的变量直接包含变量的实例,使用效率比较高. 2.引用类型分配在托管堆上,引用类型的变量通常包含一个指向实例的指针,变量通过该指针来引用实例.3.值类型继承自ValueType(注意:而System.ValueType又继承自System.Object):而引用类型继承自System.Object. 4.值类型变量包含其实例数据,每个变量保存了其本身的数据拷贝(副本),因此在默认情况下,值类型的参数传递不会影响参数本身:而引用类型变量保存了其数据的引用地址,因

asp.net 中关于C#值类型和引用类型

在c#中,值类型:整型.布尔型.字符型.实数型.结构型.枚举型.引用类型:类.对象.字符串.数组.接口.委托. 区别: 1.值类型通常被分配在栈上,它的变量直接包含变量的实例,使用效率比较高. 2.引用类型分配在托管堆上,引用类型的变量通常包含一个指向实例的指针,变量通过该指针来引用实例. 3.值类型继承自valuetype(注意:而system.valuetype又继承自system.object):而引用类型继承自system.object. 4.值类型变量包含其实例数据,每个变量保存了其本

请教:关于值类型与引用类型

问题描述 C#中一切皆对象,而对象为引用类型,那么岂不是所有数据均应存储在堆上?或者这样说对象中值类型的数据成员是存储在堆上还是存储在栈上? 解决方案 解决方案二:就算知道对象储存在哪里,又有什么用呢?解决方案三:局部变量的值类型,以及局部变量的引用本身(不是引用的对象),在堆栈上.解决方案四:引用楼主qingfeng_zeng的回复: C#中一切皆对象,而对象为引用类型,那么岂不是所有数据均应存储在堆上?或者这样说对象中值类型的数据成员是存储在堆上还是存储在栈上? 就算是按照你说的"对象为引用

一方面:int是值类型,int a 定义在栈上;另一方面int又继承自Object类,是个类,类的对象应该在堆上

问题描述 ①inta=newint();这种写法,a中存储的是地址吗?②有人说,int是个静态类,所以可以inta:这个说法对吗?③版主说,int是值类型,在编译的时候会自动进行装箱拆箱,请问inta=10在编译时会被装箱成对象吗(如果这样岂不是更复杂了)?④一方面:int是值类型,inta定义在栈上:另一方面int又继承自Object类,是个类,类的对象应该在堆上.这不是矛盾嘛? 解决方案 解决方案二:引用楼主sshziliao3的回复: ①inta=newint();这种写法,a中存储的是地

System.ArgumentException: 值类型与列类型不匹配

问题描述 刚下载了一个OA系统源码.但出现了如题上的错误.代码如下.publicstaticDataTableConvertDataReaderToDataTable(SqlDataReaderdataReader){DataTabledatatable=newDataTable();DataTableschemaTable=dataReader.GetSchemaTable();//动态添加列try{foreach(DataRowmyRowinschemaTable.Rows){DataCol