zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    [PHP]防止表单重复提交的几种方法
    [PHP]PHP的session机制,配置与高级应用
    苹果IOS开发者账号总结--发布应用APP时team name是否可以随意写?
    转:《走出软件作坊》读书笔记
    英语学习技巧摘要
    英语学习规划与目标
    转:人生成功必读的经典语录200条
    转载: PHP错误:Warning: Cannot modify header information
    jQuery Mobile页面返回无需重新get
    mongodb type it for more
  • 原文地址:https://www.cnblogs.com/francisXu/p/13602717.html
Copyright © 2011-2022 走看看