枚举需要多少内存?

时间:2014-03-31 17:48:10

标签: c# .net memory types enums

我需要决定是否将enum用于我项目中需要的大数组中。要做到这一点,我必须知道enum变量的大小。

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

private Player _owner;

_owner将占用多少内存?

我还没有在C#中找到关于此的正确信息,这就是为什么这个C ++和Java主题不适用的原因:How much memory do Enums take?

1 个答案:

答案 0 :(得分:14)

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

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

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

由于您的Player枚举类型未指定基础时间,因此编译器会将其视为基于int的{​​{1}}。如果关注内存,您可能需要考虑将其声明为Enum而不是

byte

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

First

您可能希望插入标有private Player _owner; // this value will initially equals Player.First PlayerNone的其他Empty字面值来表示Undefined变量的默认值:

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 文字只是作为其基础类型的常量。它们的目的是使代码更易于阅读,并在编译时强制执行一组有限的可能值。

有关详细信息,请查看documentation