为什么我应该制作枚举 Int32 而不是字节的基础类型

本文关键字:字节 类型 我应该 枚举 Int32 为什么 | 更新日期: 2023-09-27 18:31:46

给定以下枚举:

public enum Operations_PerHourType : byte
{
    Holes = 1,
    Pieces = 2,
    Sheets = 3,
    Strips = 4,
    Studs = 5
}

当我运行Microsoft代码分析工具时,它告诉我:

CA1028:Microsoft.Design:如果可能,将底层类型设置为"Enums.Operations_PerHourType"System.Int32而不是"byte"。

它永远不会有超过几个可能的值,所以我将其声明为一个字节。 为什么他们会推荐使用 int32? 为未来的可扩展性提供更多价值?还是性能有所提高?

为什么我应该制作枚举 Int32 而不是字节的基础类型

请查看 MSDN 以了解原因。

以下为摘录:

枚举是一种值类型,用于定义一组相关的命名 常数。默认情况下,System.Int32 数据类型用于存储 常量值。即使可以更改此基础类型,它也是 在大多数情况下,这不是必需的,也不建议使用。请注意,没有 通过使用 小于 Int32。如果无法使用默认数据类型,则 应使用符合公共语言系统 (CLS) 的整数之一 类型、字节、Int16、Int32 或 Int64,以确保所有值 枚举可以用符合 CLS 的编程表示 语言。

在特定情况下,缩小基础类型会带来一些优势,例如,在与非托管代码接口时与性能相关或强制使用特定的内存布局。

请考虑以下示例:

using System;
public enum Operations_PerHourType //   : byte
{
    Holes = 1,
    Pieces = 2,
    Sheets = 3,
    Strips = 4,
    Studs = 5
}
class Program
{
    static void Main()
    {
        long before = GC.GetTotalMemory(false);
        var enums = new Operations_PerHourType[10000];
        long after = GC.GetTotalMemory(false);
        Console.WriteLine(after - before);
        // output  (byte): 12218 (I'm using Mono 2.8)
        // output (Int32): 40960
    }
}

此代码占用大约 40 KB 的堆。 现在将基础类型指定(取消注释)为 byte 并重新编译。 哇。 突然之间,我们只需要大约 10 KB。

像这样压缩内存有时可能会使程序变慢,而不是更快,具体取决于特定的访问模式和数据大小。 除了进行一些测量并尝试推广到其他可能的情况之外,没有办法确定。 较小数据的顺序遍历通常更快。

但是,养成仅仅因为通常可能且有时至关重要而指定窄类型的习惯并不是一个好主意。 由于周围更广泛的数据类型的内存对齐,内存节省很少实现。 然后,由于需要额外的指令来屏蔽填充字节,性能要么相同,要么略差。

正如另一个答案已经很好地指出的那样,请遵循运行时优化的Int32人群,直到您必须开始分析和解决应用程序中的实际内存占用

根据文档,使用字节而不是 INT32 不会提高性能。 除非有理由这样做,否则他们建议不要更改它。 基本思想是,.NET 针对在许多情况下使用 INT32 进行了优化,他们选择枚举是有原因的。 通过更改它,您的方案中不会得到任何东西,所以为什么要打扰。

http://msdn.microsoft.com/en-us/library/ms182147.aspx

这也讨论了如何优化 .NET 以使用 32 位整数:.NET 优化 Int32