C#语法学习-托管类型、非托管类型

在介绍 C# 的托管类型和非托管类型之前,我们先来说说 C# 的类型体系以及各种类型在内存(虚拟内存)中的存储方式。

C# 类型体系

C# 的类型包含以下三大类:

  • 值类型
    • 枚举
    • 结构
      • 数值类型(numeric)
        • 整型
        • 浮点型
        • decimal
      • 布尔类型(bool)
      • 用户定义的结构(structure)

值类型的变量直接包含其数据。对于值类型,每个变量都具有其自己的数据副本,对一个变量执行的操作不会影响另一个变量(in、ref 和 out 参数变量除外;请参阅 in、ref 和 out 参数修饰符)。

  • 引用类型
    • 类(class 类-C#编程指南、类-C#参考)
    • 接口(interface 接口-C#编程指南、接口-C#参考)
    • 委托(delegate 委托-C#编程指南、委托-C#参考)
    • 对象(object 对象-C#编程指南、对象-C#参考)
    • 字符串(string 字符串-C#编程指南、字符串-C#参考)
    • 动态类型(dynamic 动态类型-C#编程指南、动态类型-C#参考)

引用类型的变量存储对其数据(对象)的引用。对于引用类型,两个变量可引用同一对象。因此,对一个变量执行的操作会影响另一个变量所引用的对象。

  • 指针类型
    • 整型指针(sbyte、byte、short、ushort、int、uint、long、ulong)
    • 浮点型指针(float、double)
    • 小数型指针(decimal)
    • 布尔型指针(boolean)
    • 枚举型指针(enum)
    • 字符型指针(char)
    • 指针型指针
    • 不包含托管类型成员的结构型指针,也就是非托管struct指针(只有非托管类型的字段的struct 是非托管类型struct,包含托管类型成员的struct是托管类型struct

指针类型不从对象(object)继承,并且指针类型与对象(object)之间不存在转换。 此外,装箱和取消装箱不支持指针。 但是,你可在不同的指针类型之间以及指针类型和整型之间进行转换。

.NET 内存模型:

托管类型

托管类型包括 引用类型 以及 包含有引用类型或托管类型成员的结构

  • 引用类型
  • 含引用类型或托管类型成员(字段、自动实现 get 访问器的属性)的结构(managed structure)
// 托管结构。
public struct Foo { 
      public string Name; // 包含引用类型字段。
      public string Bar { get; private set; } // 包含自动实现 get 访问器的引用类型属性。
 }

 public struct Bar { 
      public Foo Foo; // 包含托管类型字段(托管结构)。
}

非托管类型  详情:非托管类型 - C# 参考 | Microsoft Docs

非托管类型包括枚举、指针和不包含引用类型成员(字段、属性)的结构:

如果某个类型是以下类型之一,则它是非托管类型 :

  • sbytebyteshortushortintuintlongulongcharfloatdoubledecimal 或 bool
  • 任何枚举类型
  • 任何指针类型
  • 任何用户定义的 struct 类型,只包含非托管类型的字段

你可能感兴趣的:(C#基础,c#,学习,开发语言)