оператор для перечисления
-
20-09-2019 - |
Вопрос
Просто из любопытства, спрашивая об этом
Как выражение внизу
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 я могу вспомнить три причины:
- Это хрупко. Если кто -то решит переупорядочить перечисление, то вы получите неверные функции, вызванные.
- Это не ячее. Я не могу понять, какая функция будет работать в этом случае без переключения на определение перечисления и не проверяя, в каком порядке указаны перечисления.
- Каждая функция начинается с минус 100 баллов. Что -то подобное вряд ли оправдывает усилия, необходимые для спецификации, создания, документирования и проверки, особенно по сравнению с другими функциями, и особенно особенно Когда уже есть очень жизнеспособная альтернатива на языке.
Синтаксис C# заимствовал из C ++ и C ++ Синтаксис заимствовал из C, а C не имел ???:::
Оператор, потому что K & R, вероятно, не чувствовал, что это было необходимо. Это не «бесполезный оператор», но он будет считаться синтаксическим сахаром.
Более того, для оператора не очень хорошая идея, чтобы полагаться на конкретный упорядочение констант в декларации Enum.
Условие оценивается в истинном или ложном. Что предлагается алгоритм вашего несуществующего оператора? Трудно сказать, может ли это быть полезным или нет, но переключатель может делать то, что вам нужно.
Основная проблема - помимо того, что она небезопасна, ненужна и, вероятно, нечитаемой в большинстве реальных случаев, заключается в том, что она продвигает модель программирования, которую большинство людей в наши дни считают плохим.
У большинства языков есть стили программирования/дизайна, которые они позволяют, и те, которые они хотят продвигать. C# позволяет императивное и процедурное программирование, но способствует использованию объектно -ориентированных методов. Ваш оператор твердо принадлежит в первом лагере и не является тем, что дизайнеры языка хотели бы поддержать.
Если вы действительно хотите программировать в этом стиле, то вы могли бы использовать:
myValue = (f == Fruit.apple) ? fnApple()
: (f == Fruit.mango) ? fnMango()
: fnOrange();