您的位置:首页 > 产品设计 > UI/UE

从ValueType讨论c#的值类型系统

2015-07-29 12:52 351 查看

博客迁移

无论上层语言类型多么复杂,在.net平台上,都逃不过CTS 的约束,今天我想谈的不是CTS,而是上层语言C#类型的一点研究。

public struct test
{
public override bool Equals(object obj)
{
return base.Equals(obj);
}
}


这是我随便定义的一个结构,可以看到这个结构什么都没继承,但是我却可以重写出Equals方法,这个方法来自哪里,这个结构的父亲又是谁?

为什么不能继承类

ValueType!

是的 所有的结构都默认继承了该类,对的这是一个类,也就是说所有的结构都是有继承的,继承了ValueType,也是因为这样,所以结构不再能继承类,只能继承接口,因为C#是单继承的。

为什么每个结构都有ToString等方法

ValueType! 还是ValueType!

因为结构默认是继承了ValueType,也就是继承了Object,所有其实结构可以看成一个类,只是这个类很特别,比静态类,最终类还特别,区别包括:编译时会对他进行特殊处理,内存分配规则,不能被继承,实例化过程等等。所以结构在写法上和类很多地方很像,比如也可以拥有方法,等等,其实结构就是一个被阉割得非常厉害的类。

enum 的类型

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 特殊值类型

值类型的特点:值类型的数据特点很多,大多是和类做区分的,具体可参照http://www.jb51.net/article/53653.htm

值类型 可以继承接口 用接口访问值类型的时候 是值还是引用

答案是引用

IComparable i = 0;

当用接口指向值的时候 这个值会有一个装箱的过程,也就是值类型会装箱成一个引用类型

证明过程http://blog.csdn.net/qing2005/article/details/6492906

在刚接触C#的时候,老师给我说c# 和java很大的区别是c#里面只类型也是对象,他给我的证明理由是int也可以.出ToString()。写到这也解决了心中的一大惑憾。希望能给大家一点帮助。

一点笔记参考:2015.7.29

转载备注http://blog.csdn.net/shanghongshen/article/details/47126021
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: