Индексация массивов с перечислениями в C#

PL / SQL жалуется, что TRUE не является допустимым идентификатором или переменной. Настройте локальную переменную, установите ее в TRUE и передайте ее в функцию get_something.

17
задан gix 14 January 2009 в 17:35
поделиться

6 ответов

Я подозреваю, что Вы можете быть в состоянии сделать его немного быстрее путем компиляции делегата, чтобы сделать преобразование для Вас, такой, что это не требует упаковки и распаковывания. Дерево выражений может быть самым простым способом сделать это при использовании.NET 3.5. (Вы использовали бы это в своем примере EnumArray.)

Лично я очень испытал бы желание использовать Ваш const int решение. Это не похоже на.NET, обеспечивает проверку перечисления значений так или иначе по умолчанию - т.е. Ваши вызывающие стороны могли всегда бросать int.MaxValue к Вашему перечислимому типу, и Вы получите ArrayIndexException (или безотносительно). Так, учитывая относительное отсутствие защиты / безопасность типов Вы уже добираетесь, ответ постоянной величины обращается.

, Надо надеяться, Marc Gravell приедет через минуту для изложения в деталях скомпилированного делегата преобразования идея хотя...

8
ответ дан 30 November 2019 в 08:59
поделиться

Если бы Ваш EnumArray не был универсален, но вместо этого явно взял индексатор StatType то - тогда Вы были бы в порядке. Если бы это не желательно, то я, вероятно, использовал бы константу, приближаются ко мне. Однако быстрый тест с передачей в Func< T, E> шоу никакое заметное различие по сравнению с прямым доступом.

 public class EnumArray<T, E> where E:struct {
    private T[] _array;
    private Func<E, int> _convert;

    public EnumArray(int size, Func<E, int> convert) {
        this._array = new T[size];
        this._convert = convert;
    }

    public T this[E index] {
        get { return this._array[this._convert(index)]; }
        set { this._array[this._convert(index)] = value; }
    }
 }
5
ответ дан 30 November 2019 в 08:59
поделиться

Если бы у Вас есть много наборов фиксированного размера, то, вероятно, было бы легче обернуть Ваши свойства в объекте, чем плавание []:

public class Stats
{
    public float Foo = 1.23F;
    public float Bar = 3.14159F;
}

Раздавание объекта даст Вам безопасность типов, краткий код и постоянно-разовый доступ, который Вы хотите.

И если Вы действительно потребность использовать массив, его достаточно легкий добавить ToArray () метод, который отображает свойства Вашего объекта к плаванию [].

3
ответ дан 30 November 2019 в 08:59
поделиться

перечисления, как предполагается, безопасны с точки зрения типов. Если Вы используете их в качестве индекса массива, Вы фиксируете и тип и значения перечисления, таким образом, Вы не обладаете никаким преимуществом по объявлению статического класса международных констант.

1
ответ дан 30 November 2019 в 08:59
поделиться

Я не полагаю, что существует любой способ добавить неявный оператор преобразования к перечислению, к сожалению. Таким образом, необходимо будет или жить с ужасными преобразованиями типа или просто использовать статический класс с consts.

Вот вопрос о StackOverflow, который обсуждает больше на неявном операторе преобразования:

мы можем определить неявные преобразования перечислений в c#?

0
ответ дан 30 November 2019 в 08:59
поделиться

Я не на 100% знаком с C#, но я видел, что неявные операторы раньше отображали один тип на другого прежде. Можно ли создать неявный оператор для Перечислимого типа, который позволяет Вам использовать его в качестве интервала?

0
ответ дан 30 November 2019 в 08:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: