从ValueType讨论c#的值类型系统
无论上层语言类型多么复杂,在.net平台上,都逃不过CTS 的约束,今天我想谈的不是CTS,而是上层语言C#类型的一点研究。
public struct test { public override bool Equals(object obj) { return base.Equals(obj); } }这是我随便定义的一个结构,可以看到这个结构什么都没继承,但是我却可以重写出Equals方法,这个方法来自哪里,这个结构的父亲又是谁?
为什么不能继承类ValueType!
是的 所有的结构都默认继承了该类,对的这是一个类,也就是说所有的结构都是有继承的,继承了ValueType,也是因为这样,所以结构不再能继承类,只能继承接口,因为C#是单继承的。
ValueType! 还是ValueType!
因为结构默认是继承了ValueType,也就是继承了Object,所有其实结构可以看成一个类,只是这个类很特别,比静态类,最终类还特别,区别包括:编译时会对他进行特殊处理,内存分配规则,不能被继承,实例化过程等等。所以结构在写法上和类很多地方很像,比如也可以拥有方法,等等,其实结构就是一个被阉割得非常厉害的类。
enum也是值类型 为什么这么说呢?
typeof(枚举).BaseType 可以看到enum的父类是 System.Enum 类, 而System.Enum继承ValueType
enum 的内存分配方式和值类型一直都是分配在栈上
enum是一种特殊的值类型,不能有构造,函数等等
但是 System.Enum是类 (引用类型)
所以 并不是所有继承ValueType的都是值类型(这个类我们自己也可以写个类去继承)
那些类型是值类型?值类型有什么特点基础类型
decimal
System.Decimal
有28位小数的高度精度浮点数
bool
System.Boolean
true或false
char
System.Char
16位Unicode字符
byte
System.Byte
8位无符号整型
sbyte
System.Sbyte
8位有符号整型
short
System.Int16
16位有符号整型
int
System.Int32
32位有符号整型
long
System.Int64
64位有符号整型
ushort
System.Uint16
16位无符号整型
uint
System.Uint32
32位无符号整型
ulong
System.Uint64
64位无符号整型
single(float)
System.Single
单精度浮点类型
double
System.Double
双精度浮点类型
用户自定义值类型 (已关键字 struct 声明的)
enum 特殊值类型
值类型的特点:值类型的数据特点很多,,大多是和类做区分的,具体可参照
值类型 可以继承接口 用接口访问值类型的时候 是值还是引用答案是引用
IComparable i = 0;
当用接口指向值的时候 这个值会有一个装箱的过程,也就是值类型会装箱成一个引用类型
证明过程
在刚接触C#的时候,老师给我说c# 和java很大的区别是c#里面只类型也是对象,他给我的证明理由是int也可以.出ToString()。写到这也解决了心中的一大惑憾。希望能给大家一点帮助。
一点笔记参考:2015.7.29
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/69127.html
- 上一篇:WPF如何实现窗体透明
- 下一篇:#111 (div.2) A. Twins