Вопрос

Просто из любопытства, спрашивая об этом

Как выражение внизу

a = (condition) ? x : y; // two outputs

Почему у нас не может быть оператора для перечисления?
сказать,

myValue = f ??? fnApple() : fnMango() : fnOrange(); // no. of outputs specified in the enum definition

Вместо операторов переключения (даже если возможна рефакторирование)


enum Fruit
{
    apple,
    mango,
    orange      
};

Fruit f = Fruit.apple;

Или это какой -то бесполезный оператор?

Это было полезно?

Решение

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

switch (f)
{
    case Fruit.Apple: myValue = fnApple(); break;
    case Fruit.Mango: myValue = fnMango(); break;
    case Fruit.Orange: myValue = fnOrange(); break;
    default: throw new ArgumentOutOfRangeException("f");
}

В качестве альтернативы, создайте карту:

static readonly Dictionary<Fruit, Func<Foo>> FruitFunctions = 
    new Dictionary<Fruit, Func<Foo>> {
    { Fruit.Apple, fnApple },
    { Fruit.Mango, fnMango },
    { Fruit.Orange, fnOrange }
};
...

myValue = FruitFunctions[f]();

Боюсь, я использовал обе методы в различных ситуациях, и я предпочитаю их предложенному оператору.

Другие советы

Offhand я могу вспомнить три причины:

  1. Это хрупко. Если кто -то решит переупорядочить перечисление, то вы получите неверные функции, вызванные.
  2. Это не ячее. Я не могу понять, какая функция будет работать в этом случае без переключения на определение перечисления и не проверяя, в каком порядке указаны перечисления.
  3. Каждая функция начинается с минус 100 баллов. Что -то подобное вряд ли оправдывает усилия, необходимые для спецификации, создания, документирования и проверки, особенно по сравнению с другими функциями, и особенно особенно Когда уже есть очень жизнеспособная альтернатива на языке.

Синтаксис C# заимствовал из C ++ и C ++ Синтаксис заимствовал из C, а C не имел ???::: Оператор, потому что K & R, вероятно, не чувствовал, что это было необходимо. Это не «бесполезный оператор», но он будет считаться синтаксическим сахаром.

Более того, для оператора не очень хорошая идея, чтобы полагаться на конкретный упорядочение констант в декларации Enum.

Условие оценивается в истинном или ложном. Что предлагается алгоритм вашего несуществующего оператора? Трудно сказать, может ли это быть полезным или нет, но переключатель может делать то, что вам нужно.

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

У большинства языков есть стили программирования/дизайна, которые они позволяют, и те, которые они хотят продвигать. C# позволяет императивное и процедурное программирование, но способствует использованию объектно -ориентированных методов. Ваш оператор твердо принадлежит в первом лагере и не является тем, что дизайнеры языка хотели бы поддержать.

Если вы действительно хотите программировать в этом стиле, то вы могли бы использовать:

    myValue = (f == Fruit.apple) ? fnApple() 
            : (f == Fruit.mango) ? fnMango()
            : fnOrange();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top