• Atitit 变量类型系统 目录 1. 通用类型系统 (Common Type System) 1 1.1. CTS 的类型[编辑] 1 2. CLR支持两种基本类型:值类型和引用类型。因此,还是把


    Atitit 变量类型系统

     

    目录

    1. 通用类型系统 (Common Type System) 1

    1.1. CTS 的类型[编辑] 1

    2. CLR支持两种基本类型:值类型和引用类型。因此,还是把MSDN这张经典视图拿出来做个铺垫。 1

    3. 值类型包含  【枚举类型】。 3

    4. 引用类型体系树木 3

    4.1. 接口类型interface,数组类型,委托类型,类类型(object,string,class) 3

    5. 引用类型体系树2 3

    5.1. 指针,接口,字描述类型(数组,类类型) 3

    5.2. 类类型(用户类,委托,装箱的值类型) 3

    6. 值类型(包括数值类型 结构体 枚举:) 3

    7. 3. 引用类型 4

    8. 值类型和引用类型在内存中的部署 4

    9. 总结 4

     

    1. 通用类型系统 (Common Type System) 

    定义了运行期引擎如何使用程序中的数据类型,以及如何配置数据在存储器中的一种标准,依照此种标准所撰写的编程语言,都可以在同一个运行期引擎中使用,因此它是跨语言支持的重要部分,亦即符合 CTS 规范的编程语言所撰写出的程序,都可以在 CLR 中使用。

      1. CTS 的类型[编辑]

    CTS 定义了两种类型:

    实值类型 (Value-type)

    实值类型直接包含数据,而且实值类型的运行个体 (Instance) 不是在堆栈上配置,就是在结构中内嵌 (Inline) 配置。实值类型可为内置 (由运行阶段实现)、用户定义或枚举类型 (Enumeration)。

    参考类型 (Reference-type)

    存储变量存储器地址的参考,并且在堆积 (Heap) 上配置。参考类型可为自我描述类型、指针类型 (Pointer Type) 或接口类型 (Interface Type)。参考类型的类型可从自我描述类型的值判断出来。自我描述类型可再分为数组和类别类型。类别类型包括用户定义类型、Boxed 实值类型和委派。

     

    1. CLR支持两种基本类型:值类型引用类型。因此,还是把MSDN这张经典视图拿出来做个铺垫。

     

     

    MSDN的这张图说明了CTS中各个类型是如何相关的。注意,类型的实例可以只是值类型或自描述类型,即使这些类型有子类别也是如此。

     

     

    数据来自MSDN,为的是给我们的概念中有清晰的类型概念,这是最基础也是最必须的内容。

     

     

    1. 值类型包含  【枚举类型】。

    内置值类型(【布尔类型】、【字符型】和

     )

     

    1. 引用类型体系树木
      1. 接口类型interface,数组类型,委托类型,类类型(object,string,class)
    2. 引用类型体系树2
      1. 指针,接口,字描述类型(数组,类类型)
      2. 类类型(用户类,委托,装箱的值类型)
    3. 值类型包括数值类型 结构体 枚举:

    C#的所有值类型均隐式派生自System.ValueType:

    • 结构体:struct(直接派生于System.ValueType);
      • 数值类型:
        • 整 型:sbyte(System.SByte的别名),short(System.Int16),int(System.Int32),long (System.Int64),byte(System.Byte),ushort(System.UInt16),uint (System.UInt32),ulong(System.UInt64),char(System.Char);
        • 浮点型:float(System.Single),double(System.Double);
        • 用于财务计算的高精度decimal型:decimal(System.Decimal)。
      • bool型:bool(System.Boolean的别名);
      • 用户定义的结构体(派生于System.ValueType)。
    • 枚举:enum(派生于System.Enum);
    • 可空类型(派生于System.Nullable<T>泛型结构体,T?实际上是System.Nullable<T>的别名)。
    1. 3. 引用类型

    C#有以下一些引用类型:

    • 数组(派生于System.Array)
    • 用户用定义的以下类型:
      • 类:class(派生于System.Object);
      • 接口:interface(接口不是一个“东西”,所以不存在派生于何处的问题。Anders在《C# Programming Language》中说,接口只是表示一种约定[contract]);
      • 委托:delegate(派生于System.Delegate)。
    • object(System.Object的别名);
    • 字符串:string(System.String的别名)。

     

    1. 值类型和引用类型在内存中的部署

    经常听说,并且经常在书上看到:值类型部署在栈上,引用类型部署在托管堆上。实际上并没有这么简单。

    ,局部变量valueTypeLocalVariable也是值类型,它们究竟 是在栈上还是在托管堆上?

    规律是:

    • 引用类型部署在托管堆上;
    • 值类型总是分配在它声明的地方:作为字段时,跟随其所属的变量(实例)存储;作为局部变量时,存储在栈上。

     

     

    1. 总结

    C#中,变量是值还是引用仅取决于其数据类型。

    C#的值类型包括:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型。

    C#的引用类型包括:数组,用户定义的类、接口、委托,object,字符串。

    数组的元素,不管是引用类型还是值类型,都存储在托管堆上。

    引用类型在栈中存储一个引用,其实际的存储位置位于托管堆。为了方便,本文简称引用类型部署在托管推上。

    值类型总是分配在它声明的地方:作为字段时,跟随其所属的变量(实例)存储;作为局部变量时,存储在栈上。

    值类型在内存管理方面具有更好的效率,并且不支持多态,适合用作存储数据的载体;引用类型支持多态,适合用于定义应用程序的行为。

    [转]理解C#值类型与引用类型 - wangyan - 博客园

  • 相关阅读:
    信号量的简单使用
    [Unity 3D] Unity 3D 性能优化(二)
    Android 开机动画源码分析
    关于FTP操作的功能类
    ArcGIS Engine 改变线IPolyline的方向
    使用ORACLE SQL Tuning advisor快速优化低效的SQL语句
    Linux CPU 负载度量公式
    Java垃圾回收机制
    常用的shell命令整理
    UVa340
  • 原文地址:https://www.cnblogs.com/attilax/p/15196900.html
Copyright © 2020-2023  润新知