枚举需要多少内存?

Mic*_*hał 7 .net c# memory enums types

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

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

private Player _owner;
Run Code Online (Sandbox Code Playgroud)

需要多少记忆_owner

我没有在C#中找到关于此的正确信息,这就是为什么这个C++和Java主题不适用的原因:Enums需要多少内存?

Cro*_*ono 14

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

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

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

由于您的Player枚举类型未指定基础时间,因此编译器会将其视为int基于枚举的类型Enum.如果关注内存,您可能需要考虑将其声明为派生而来byte:

enum Player : byte
{ 
    First, 
    Second, 
    Third, 
    Fourth 
};
Run Code Online (Sandbox Code Playgroud)

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

private Player _owner; // this value will initially equals Player.First
Run Code Online (Sandbox Code Playgroud)

您可能希望插入Player标记的其他文字None,Empty或者Undefined表示Player变量默认值:

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

private Player _owner; // this value will initially equals Player.Undefined
Run Code Online (Sandbox Code Playgroud)

当然,如果您可以将其First作为默认值,则可以保留原样.请注意,虽然没有专用的默认Enum值通常被认为是一种糟糕的编码习惯.

作为替代方案,由于任何Enum都是基于结构的,您也可以声明您的_owner变量,Player?以便它null默认为:

private Player? _owner; // this value will initially equals null
Run Code Online (Sandbox Code Playgroud)

总而言之,只需记住Enum文字只是作为其基础类型的常量.它们的目的是使代码更容易阅读,并在编译时强制执行一组有限的可能值.

有关更多信息,请查看文档.