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 - 博客园

posted @ 2020-08-05 22:43  attilaxAti  阅读(36)  评论(0编辑  收藏  举报