Сколько памяти занимает перечисление?

c# .net memory types enums

4405 просмотра

1 ответ

Мне нужно решить, буду ли я использовать enums в большом массиве, который мне нужен в моем проекте. Для этого я должен знать, каков размер enumпеременной.

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

private Player _owner;

Сколько памяти _ownerзаймет?

Я не нашел правильной информации об этом в C #, поэтому эта тема C ++ и Java не применима: сколько памяти занимает Enums?

Автор: Michał Источник Размещён: 12.11.2019 09:03

Ответы (1)


14 плюса

Решение

Enumзначения преобразуются в значения базового типа во время компиляции. Следовательно, переменная самого перечислимого типа, основанная на intтипе (который используется по умолчанию) , не использует больше памяти, чем любая другая intпеременная в вашем коде.

Enum, Лежащая в основе структура может быть любой из следующих:

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

Так как ваш Playerтип перечисления не определяет базовое время, компилятор увидит его как int-based 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

Подводя итог, просто помните, что Enumлитералы просто действуют как константы для своего базового типа. Их цель - облегчить чтение кода и обеспечить ограниченный набор возможных значений во время компиляции.

Для получения дополнительной информации смотрите документацию .

Автор: Crono Размещён: 31.03.2014 05:50
32x32