发现值类型和引用类型
- 8 分钟
由于 C# 中提供了许多数据类型,因此选择正确的数据类型意味着你需要了解何时可能选择一种数据类型。
在讨论为什么可能选择某种数据类型之前,您需要更深入地了解数据类型。 还需要了解数据和数据类型在 C# 和 .NET 中的工作原理。
什么是数据?
回答“什么是数据”的问题取决于你向谁问,以及你问这个问题的语境。
在软件开发中,数据本质上是一个值,以一系列位的形式存储在计算机的内存中。 位是一个简单的二进制开关,表示为0或1,即“关闭”和“打开”。一个位似乎没有用,然而当你将8个位组合在一起形成一个序列时,它们就会形成一个字节。 在字节中使用时,每个二进制位在序列中都具有意义。 事实上,如果使用二进制数字(base-2)数字系统,则可以表示只有 8 位的 256 种不同组合。
例如,在二进制数字系统中,可以将数字 195 表示为 11000011。 下表可帮助你直观显示其工作原理。 第一行包含八列,对应于字节中的位置。 每个位置表示不同的数值。 第二行可以存储单个位的值,既可以是 0 或 1。
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 |
如果将第一行中与第二行 1 对应的每一列数字相加,即可得出该二进制数字系统表示形式的小数等值。 在这种情况下,这将是 128 + 64 + 2 + 1 = 195。
若要处理超出的值 255,计算机存储的字节数更多(通常为 32 位或 64 位)。 如果您在科学研究环境中处理数百万个大数字,则可能需要更仔细地考虑您所使用的数据类型。 代码可能需要更多内存才能运行。
文本数据怎么样?
如果计算机只了解 0s 和 1s,那么它如何允许你处理文本? 使用 ASCII(美国信息交换标准代码)等系统,可以使用单个字节来表示大写和小写字母、数字、制表符、后空、换行符和许多数学符号。
例如,如果要将小写字母 a 存储为我的应用程序中的值,计算机将只了解该值的二进制形式。 为了更好地了解计算机如何处理小写字母 a ,我需要找到一个 ASCII 表,该表提供 ASCII 值及其十进制等效项。 可以搜索术语“ASCII 查找小数”以联机查找此类资源。
在这种情况下,小写字母 a 等效于十进制值 97。 然后,反向使用相同的二进制数字系统来查找计算机如何存储 ASCII 字母 a 。
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
因为 64 + 32 + 1 = 97,8 位二进制 ASCII 代码是 a01100001。
你可能永远不需要自行执行这些类型的转换,但理解计算机的数据视角是一个基础概念,尤其是在考虑数据类型时。
什么是数据类型?
数据类型是编程语言定义为值节省多少内存的方式。 C# 语言中有许多数据类型可用于许多不同的应用程序和数据大小。
在你的职业生涯中,你所构建的大部分应用程序只会使用所有可用数据类型中的一小部分。 然而,了解其他人以及为什么存在仍然至关重要。
值与引用类型
本模块重点介绍 C# 中的两种类型:引用类型和值类型。
引用类型的变量存储对其数据(对象)的引用,即它们指向存储在其他位置的数据值。 相比之下,值类型的变量直接包含其数据。 随着您对 C# 的学习深入,关于值类型和引用类型的基本差异会出现新的细节。
简单值类型
简单值类型是 C# 作为关键字提供的一组预定义类型。 这些关键字是 .NET 类库中定义的预定义类型的别名(别名)。 例如,C# 关键字 int 是 .NET 类库中 System.Int32定义的值类型的别名。
简单值类型包括许多你可能已经使用过的数据类型,比如 char 和 bool。 还有许多 整数 和 浮点 值类型,用于表示各种整数和小数。
回顾
- 值以二进制位的形式(即简单的 on/off 开关)存储。 结合足够的这些开关,可以存储几乎所有可能的值。
- 数据类型有两种基本类别:值和引用类型。 区别在于计算机在执行程序时值存储的方式和位置。
- 简单值类型使用关键字别名来表示 .NET 库中类型的正式名称。