Сгенерированные константы для значений перечисления - PullRequest
3 голосов
/ 18 августа 2011

Мне нужно хранить некоторые свойства записей enum в их константах.Например, укажите, является ли цвет холодным или теплым.

enum Colors
{
  Yellow, // warm
  Blue,   // cold
  Gray,   // cold
  Red,    // warm
  // etc.
}

В C ++ я бы определил макрос для генерации битовых масок для констант.Примерно так:

#define WARM 1
#define COLD 0

#define MAKECOLOR(index, type) ((index << 8) | type)

enum Colors
{
  Yellow = MAKECOLOR(0, WARM),
  Blue   = MAKECOLOR(1, COLD),
  Gray   = MAKECOLOR(2, COLD),
  Red    = MAKECOLOR(3, WARM),
  // etc.
}

В C # это невозможно, потому что нет макросов.Я хочу избежать написания выражений битовой маски непосредственно в enum.Примерно так:

  ...
  Gray   = ((2 << 8) | 0),
  ...

Есть идеи?

PS
Да, я синтаксический урод сахара.: D

Ответы [ 3 ]

3 голосов
/ 18 августа 2011

Вы должны использовать атрибуты при значениях перечисления.Прочитайте эту статью, это довольно хорошо:

http://www.codeproject.com/KB/cs/enumwithdescription.aspx

Надеюсь, это поможет!

2 голосов
/ 18 августа 2011

I do стремятся записать битовое выражение непосредственно в перечисление:

enum Colors
{
    Yellow = (0 << 8) | ColorTemp.Warm,
    Blue   = (1 << 8) | ColorTemp.Cold,
    Gray   = (2 << 8) | ColorTemp.Cold,
    Red    = (3 << 8) | ColorTemp.Warm,
}

enum ColorTemp
{
    Cold = 0,
    Warm = 1,
}

, а затем написать простой класс расширения в нижней части файла, например:

public static class ColorsExtensions
{
    public ColorTemp GetTemperature(this Colors color)
    {
        return (ColorTemp)(color & 0x01);
    }
}
0 голосов
/ 18 августа 2011

В C #, enum необходимо иметь const значения, определенные во время компиляции.В итоге, C # больше const, чем C ++.

В C # const используется для обозначения константного выражения во время компиляции.Это было бы похоже на этот код C ++:

enum {
  count = buffer.Length;
}

Поскольку buffer.Length вычисляется во время выполнения, оно не является константным выражением, и поэтому это приведет к ошибке компиляции.

C # имеет ключевое слово readonly, которое немного больше похоже на const в C ++.(Тем не менее, он все еще более ограничен, и в C # нет такой вещи, как const-correctness).

const предназначен для представления константы времени компиляции ... а не просто значения только для чтения.

Боюсь, вы не можете указывать локальные переменные, доступные только для чтения, но не зависящие от времени компиляции, в C #.Некоторые локальные переменные изначально доступны только для чтения - например, переменная итерации в цикле foreach и любые переменные, объявленные в первой части оператора using.Однако вы не можете создавать свои собственные переменные только для чтения.

Если вы используете const в методе, это фактически заменяет любое использование этого идентификатора значением константы во время компиляции.

Итак, вам нужно определить ваши значения во время компиляции в вашем enum.Они не могут быть оценены во время выполнения.Это правила.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...