Skip to content
On this page

选择适当的数据类型

你已了解了值类型和引用类型以及整型类型和浮点型类型之间的差异。

假设你的任务是构建一个新应用程序,用于检索、处理和存储不同类型的数据。你应该选择哪些数据类型?

在某些情况下,很容易做出选择。例如,在需要处理文本时,可能会默认使用 string 数据类型,除非需要执行大量串联。

但在处理数值数据时,又该如何呢?有 11 种不同的选项。如何选择适当的数据类型?

如何选择适当的数据类型

由于可供选择的数据类型太多,针对特定情况应采用哪种标准来选择适当的数据类型呢?

在评估这些选项时,必须考虑一些重要的注意事项。正确答案通常不止一个,但有些答案比其他答案更正确。

  • 请选择具有所需值范围的数据类型作为应用程序中的内置约束。 所选的数据类型可以帮助设置该特定变量中可能存储的数据大小的边界。例如,如果知道某个特定变量只能存储 1 - 10,000 之间的值(否则将超出预期边界),则可能要避免使用 bytesbyte 数据类型,因为它们的范围太小。此外,还可能不会使用 intlonguintulong 数据类型,因为它们能够存储的数据比需要存储的数据多很多。同样,如果不需要小数值,则可能要避免使用 floatdoubledecimal 数据类型。你可以将选择范围缩小到 shortushort,这两种数据类型均可在给定情况下使用。如果确信负值在应用程序中没有意义,则可以选择 ushort。现在,任何赋予 ushort 类型的变量的值,只要超出 0 - 65535 的边界,都将引发异常,从而巧妙地帮助你在应用程序中强制执行一定程度的合理性检查。
  • 不要根据感知的性能影响来选择数据类型(至少在开始时不要这么做)。 你可能想要选择使用最少二进制位存储数据的数据类型,认为这样可以提高应用程序的性能。但与应用程序性能(即应用程序运行速度)相关的最佳建议是不要“过早优化”。换句话说,应该阻止自己猜测代码的哪部分(包括数据类型的选择)可能会影响应用程序的性能。很多人认为,因为给定的数据类型存储的信息较少,所以使用的计算机处理器和内存一定会少于存储更多信息的数据类型。其实你应该选择适合数据的数据类型。然后,可以凭经验使用特殊软件来衡量应用程序的性能,以真正地了解应用程序的哪部分可能会对性能产生负面影响。
  • 根据与库函数的交互以及输入和输出的数据类型来选择数据类型。 假设你想要处理在两个日期之间间隔的年份范围。如果这是业务应用程序,你可能会确定只需 1960 到 2200 的范围。因此,你可能会使用 byte,因为它可以表示 0 - 255 之间的数字。但当你研究 System.TimeSpanSystem.DateTime 类的内置方法时,就会意识到这些方法通常会接受 doubleint 类型的值。如果选择 sbyte,则会在 sbytedoubleint 之间不停地来回转换。在这种情况下,如果不需要亚秒级精度,则选择 int 会更有意义,如果需要亚秒级精度,则选择 double
  • 根据对其他系统的影响(例如,在数据库中长期存储)选择数据类型。 有时必须考虑其他应用程序或其他系统(如数据库)使用信息的方式。例如,SQL Server 的类型系统不同于 C# 的类型系统。因此,必须在这两个系统之间进行某些映射之后才能将数据保存到该数据库。如果应用程序的用途是与数据库进行交互,则可能需要考虑数据的存储方式、存储的数据量,以及选择更大的数据类型可能会对存储应用程序将生成的所有数据所需的物理存储量(和成本)产生哪些影响。
  • 如有疑问,请继续使用基本类型。 虽然我们已经介绍了一些注意事项,你通常会根据这些注意事项考虑多种不同的数据类型,但在开始使用时,为简单起见,应首选部分基本数据类型,包括:
    • int,适用于大部分整数
    • decimal,适用于表示资金的数字
    • bool,适用于 true 或 false 值
    • string,适用于字母数字值
  • 针对特殊情况选择专门的复杂类型。 如果已存在给定用途的数据类型,请不要重复发明。
    • byte,适用于来自其他计算机系统或使用不同字符集的编码数据。
    • double,用于几何学或科研用途。 double 常用于生成涉及运动的游戏。
    • System.StringBuilder,用于根据大量文本或其他变量生成字符串。我们将在 使用 C# 中的内置字符串数据类型方法修改字符串内容 模块中作更详细的介绍。
    • System.DateTime,适用于特定的日期和时间值。
    • System.TimeSpan,适用于年/月/日/小时/分钟/秒/毫秒范围。

概括

在为代码选择数据类型时存在一些注意事项。尽管应该谨慎对待并仔细斟酌数据类型的选择,但如果继续使用一些基本类型(如 intdecimalstringbool),则不会出现问题。