dotnet总结——类型系统

 包括2种大的类型: 引用类型和值类型, 放一张图说明继承层次:

一 值类型:

内置的值类型,如下

 

 

  • 用户自定义值类型就是用户定义的枚举或者结构类型。
  • 可空类型(Nullable<T>)属于 struct 类型,也是值类型
  • 引用类型保存在内存堆中 ,值类型保存在内存栈中(少数情况下不是,如当值类型是作为,某个类的实例的字段时;或者是静态类型时,局部变量被捕获升级为密封类时)
  • Struct结构类型,默认有一个public无参构造函数,该函数内部会给内部的  字段(field)初始化。 设置的值就是相应的 default(T)。所有用户不能再手动给结构类型定义无参构造函数了,
  • ValueType这个类型本身并不是值类型,而是引用类型,属于类类型
  •  值得注意的是 Deciaml不是 基元类型  ,typeof(decimal).IsPrimitive 结果是False   。
  •  基元类型包括这些:Boolean ,Char ,SByte ,Byte ,Int16 ,UInt16 ,Int32 ,UInt32 ,Int64 ,UInt64 ,IntPtr ,UIntPtr ,Single ,Double 。

二 类型转换

虽然 long 和 int 之间并不存在继承关系 ,但是编译器允许 从int 到 long的隐私转换。

对于强制转换,.net 总是向下取整 ,而不是四舍五入那样的向上取整。如 (int)6.8F 结果是6。

三 性能方面

使用引用类型性能一般比较低,因为需要经过下面这几步

1. 内存必须从堆中分配

2.堆上分配的每个对象都有一些额外的开销成员, 必须初始化,如同步块索引,类型对象指针  

3. 引用类型内部的成员也需要初始化

4. 从托管堆分配对象时,可能会引起垃圾回收

使用值类型也需要注意:

1. 避免大量的复制操作

2. 如果有判断是否相等的操作请覆盖 ValueType基类提供的Equals方法(由于使用了反射和装箱等操作),值类型需要继承IEquatable<T>接口,然后重新Equals方法,

如:struct Vector : IEquatable<Vector> ,里编写方法public override bool Equals(object obj)  和 public bool Equals(Vector other) 。

如果有按照大小排序的操作还需要实现System..IComparable接口中的CompareTo方法和System..IComparable<T>类型安全的CompareTo方法。还可以考虑运算符重载。

3. 值类型是密封类不支持继承,值类型没有同步块索引,占用的空间更少,但也因此不能作为线程同步工具使用。值类型也没有类型对象指针

4. 如果值类型内部包含引用类型字段,则改值类型复制时,内部的引用类型字段是浅复制。也就是说多个值类型指向的是同一份引用类型。

关于常见的术语

  • 公共语言运行时 CLR (Common Language Runtime) 是 公共语言基础设施CLI(Common Language Infrastructure)的一个实现(implementation),
  • 其中 CLR 最主要的两个部分是公共类型系统 CTS(Common Type System)和 公共语言规范 CLS(Common Language Specification)。
  • 名词解释:

  CTS简单来说就是一种语法和规范,CTS定义了类型,所有服从CTS的语言都可以看成是.Net框架上的语言,但是.Net框架上的众多语言都各自实现了CTS的一小部分,这部分称为CLS。

  CLS是这些语言的程序集可以互相使用的前提。反正如果不满足CLS,你的语言就不能被其他.Net框架上的语言使用。

CLI 详细地址 :https://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf

C# Language Specification : http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-334.pdf

原文地址:https://www.cnblogs.com/francisXu/p/13602717.html