我需要决定是否将enum
用于我项目中需要的大数组中。要做到这一点,我必须知道enum
变量的大小。
enum Player
{
First,
Second,
Third,
Fourth
};
private Player _owner;
_owner
将占用多少内存?
我还没有在C#中找到关于此的正确信息,这就是为什么这个C ++和Java主题不适用的原因:How much memory do Enums take?
答案 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
,Player
或None
的其他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。