值类型直接持有值 — 例如,所有基本类型、结构体和枚举。然而,C# 引用类型包含对堆上值的引用 — 例如,字符串、对象、类、数组、委托。
C# 值类型和引用类型
分配给变量的内存类型
在继续讨论数据类型(C# 值类型和引用类型)的分类之前,让我们快速了解一下应用程序中的内存分类。
- 全局内存(Global): 实际上,这是一个 C 语言概念,其中全局变量会使用这种全局内存。这些变量在应用程序启动时分配内存,并一直存在直到应用程序的生命周期结束。
- 栈(Stack): 由方法的局部变量使用。当一个方法被调用时,会为该方法的局部变量分配一块栈内存。当方法返回时,栈内存将被清除。
- 堆(Heap): 应用程序在运行时的内存需求将从堆内存中满足。当一些内存分配给堆变量后,一旦其工作完成,就必须返回给堆(释放),以便其他变量重用。

值类型
通常,所有的基本数据类型、结构体和枚举都属于值类型。
从某种意义上说,值类型是分配给变量的内存,其中包含变量的实际值。
内存会根据变量的作用域分配给值类型。如果它是一个局部变量或参数,它会分配栈内存。如果它是一个对象的成员,它将在堆上分配内存。
引用类型
分配给引用类型的内存永远不会持有变量的实际值。相反,它持有对堆上值的引用。
在实时环境中,所有与内存相关的任务都由 .Net 通过内存管理来处理。
但作为一名程序员,了解这一点会更好,这样您可以更有效地优化代码,并获得更好的性能。