值类型与引用类型
介绍
价值类型
值类型是两者中较简单的。值类型通常用于表示数据本身。3D 空间中的整数,布尔值或点都是良好值类型的示例。
使用 struct 关键字声明值类型(结构)。有关如何声明新结构的示例,请参阅语法部分。
一般来说,我们有 2 个关键字用于声明值类型:
- 结构
- 枚举
参考类型
参考类型稍微复杂一些。参考类型是面向对象编程意义上的传统对象。因此,它们支持继承(以及它的好处)并且还支持终结器。
在 C#中,我们通常有这样的引用类型:
- 类
- 代表
- 接口
使用 class 关键字声明新的引用类型(类)。有关示例,请参阅语法部分以了解如何声明新的引用类型。
主要差异
参考类型和值类型之间的主要区别如下所示。
堆栈上存在值类型,堆上存在引用类型
这是两者之间经常提到的差异,但实际上,它归结为当你在 C#中使用值类型时,例如 int,程序将使用该变量直接引用该值。如果你说 int mine = 0,那么变量 mine 直接指向 0,这是有效的。但是,引用类型实际上(顾名思义)是对底层对象的引用,这类似于其他语言(如 C++)中的指针。
你可能不会立即注意到这种效果,但效果是存在的,是强大的并且是微妙的。有关示例,请参阅其他地方更改引用类型的示例。
这种差异是导致以下其他差异的主要原因,值得了解。
在方法中更改值类型时,值类型不会更改,引用类型会更改
当值类型作为参数传递给方法时,如果方法以任何方式更改值,则值不会更改相反,将引用类型传递到同一方法并更改它将更改基础对象,以便使用同一个对象的其他东西将具有新更改的对象而不是其原始值。
有关详细信息,请参阅方法中的值类型与引用类型的示例。
如果我想改变它怎么办?
只需使用 ref
关键字将它们传递给你的方法,然后通过引用传递此对象。意思是,它是记忆中的同一个对象。因此,你所做的修改将受到尊重。有关示例,请参阅通过引用传递的示例。
值类型不能为 null,引用类型可以
就像它说的那样,你可以为引用类型赋值 null,这意味着你分配的变量没有分配给它的实际对象。但是,在值类型的情况下,这是不可能的。但是,你可以使用 Nullable 来允许你的值类型可以为空,如果这是一个要求,但是如果这是你正在考虑的事项,请强烈思考一个类可能不是最好的方法,如果它是你自己的类型。