一个枚举占用多少内存?

11

我需要决定是否在我的项目中使用enum。为了做出决策,我需要知道enum变量的大小。

enum Player 
{ 
     First, 
     Second, 
     Third, 
     Fourth 
};

private Player _owner;

_owner 将会占用多少内存?

我在 C# 中没有找到相关的信息,所以这个关于 C++ 和 Java 的话题不适用:枚举类型占用多少内存?


我不能确定地说,但根据enum中4个整数占用的空间,我认为你正在查看128字节。 - Mike Perrenoud
1
这取决于基础类型。 - harold
1个回答

23
Enum值在编译时被转换为基础类型的值。因此,枚举类型本身基于int类型(这是默认类型)的变量与您代码中的任何其他int变量一样,并不会使用更多的内存。

Enum的底层结构可以是以下任何一种:

  • byte
  • sbyte
  • short
  • ushort
  • int
  • uint
  • long
  • ulong

由于您的Player枚举类型未指定基础类型,编译器将其视为基于intEnum。如果内存是一个问题,您可能需要考虑将其声明为派生自byte的类型:

enum Player : byte
{ 
    First, 
    Second, 
    Third, 
    Fourth 
};

请注意:新声明的Enum变量将具有与其基础类型默认值相同的值,该默认值始终为零。在未指定文字值的枚举中,列表中的第一项被视为默认值。在您的情况下,那将是First

private Player _owner; // this value will initially equals Player.First

您可能希望插入一个额外的Player文字,标记为NoneEmptyUndefined,以表示Player变量的默认值:

enum Player : byte
{ 
    Undefined = 0;
    First, 
    Second, 
    Third, 
    Fourth 
};

private Player _owner; // this value will initially equals Player.Undefined

当然,如果你不介意将 First 作为默认值,可以保持原样。但要注意,没有专门的默认 Enum 值通常被认为是一种不好的编程实践。

作为替代方案,由于任何 Enum 都是基于结构的,因此您还可以将 _owner 变量声明为 Player?,这样它将默认为 null

private Player? _owner; // this value will initially equals null

总之,记住枚举字面值仅仅充当其基础类型的常量。它们的目的是使代码更易于阅读,并在编译时强制使用有限的一组可能值。

要了解更多信息,请查看文档


更重要的是,它们并没有比其他类型占用更少的内存。正如您所说,“Player”的基础类型是“int”,它可以容纳任何“int”值,但熟悉其他编程语言的程序员可能期望它只占用一个字节的空间。 - user743382
@hvd 所以枚举类型只占用一个字节的可能性不存在吗? - Michał
@Michał 这是可能的,但需要明确指定一个字节的基础类型(bytesbyte)。 - user743382
每个枚举类型都有一个基础类型,可以是除 char 以外的任何整数类型。 - Hamlet Hakobyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接