选择正确的数据类型
由于 C# 中提供了许多不同的数据类型,因此选择正确的数据类型意味着你需要了解每个数据类型的作用,以及在什么时候可能需要选择一种数据类型替代另一种数据类型。
但在我们开始讨论为什么要选择一种类型替代另一种类型之前,你首先需要了解数据和数据类型在 C# 和 .NET 中的作用方式并了解更多数据类型,包括相似数据类型之间的关键差异。
什么是数据
“什么是数据”这个问题的答案取决于你询问的对象和询问此问题时的背景。
在软件开发领域,数据实质上是以一系列二进制位的形式存储在计算机内存中的值。二进制位是一个简单的二进制开关,分别表示为 0 或 1;或者说“关”或“开”。一个二进制位看起来没什么用。但如果按序列组合八个二进制位,则可以形成一个字节。在字节中使用时,每个二进制位在序列中都具有意义。实际上,如果使用二进制(或 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 的更大值,计算机需要存储更多字节。如果在科学计算环境中处理上百万个大额数字,则可能需要更仔细地斟酌使用的数据类型。代码可能需要更多内存来运行。
那文本数据呢
如果计算机只理解 0 和 1,它又通过何种方式让我们能够处理文本?借助像 ASCII 之类的系统,可以使用一个字节表示大写和小写字母、数字、制表符、回车符、退格符、换行符和多种数学符号、块、线条等等。
例如,如果你想在你的应用程序中将小写的 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。
你可能永远不需要自己执行这些类型的转换,但从计算机的角度理解数据是一种基础概念,尤其是当我们正在考虑数据类型时。
什么是数据类型
数据类型是一种编程语言构造,用于定义要为某个值保留多少内存。这就是我们有如此多数据类型的原因了,因为编程语言的设计人员知道数据类型将用于众多不同的应用程序和数据大小。
考虑到你在职业生涯中将要构建的应用程序类型,你就会发现你只选定了所有可用数据类型中的一小部分。但仍必须知道还存在其他数据类型以及为什么存在。
值类型与引用类型
数据类型有两种基本类别:值类型和引用类型。值类型和引用类型之间的基本差异涉及到这些值在应用程序执行时临时存储在内存中的位置。值的存储位置会影响 .NET 运行时管理值的生命周期的方式,该生命周期包括声明(出生)、分配和检索(生存)和终止(死亡)。这反过来会影响在使用值类型或引用类型时所用的语法。
此模块将重点介绍简单的值类型和引用类型。在详细了解 C# 的过程中,将出现与值类型和引用类型之间的基本差异相关的新的详细信息。
简单的值类型
简单的值类型是由 C# 提供作为关键字的一组预定义类型。这些关键字只是 .NET 类库中定义的预定义类型的别名。例如,C# 关键字 int 是在 .NET 类库中定义为 System.Int32 的值类型的别名。
简单的值类型包括许多你可能已使用过的数据类型,例如 char 和 bool。此外,还有很多整型和浮点型值类型,用于表示各种整数和小数。
备注
除了简单的值类型外,其他值类型还包括枚举和结构。但我们将在其他模块中介绍。
概括
- 值以二进制位的形式(即简单的 on/off 开关)存储。通过组合足够多的此类开关可以存储几乎任何可能的值。
- 数据类型有两种基本类别:值类型和引用类型。不同之处在于计算机在执行程序时存储值的方式和位置。
- 简单的值类型包括有符号和无符号整型数值类型和浮点型数值类型。