Pregunta

Solo por curiosidad pregunto esto

Como la expresión de abajo

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

¿Por qué no podemos tener un operador para enumeraciones?
decir,

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

en lugar de declaraciones de cambio (aunque es posible refactorizar)


enum Fruit
{
    apple,
    mango,
    orange      
};

Fruit f = Fruit.apple;

¿O es algún tipo de operador inútil?

¿Fue útil?

Solución

No puedo decir que siempre he querido un operador tal - que sería muy frágil, apoyándose en el orden de los valores de enumeración. Puede utilizar simplemente un interruptor:

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");
}

Por otra parte, crear un mapa:

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

myValue = FruitFunctions[f]();

He utilizado ambas técnicas en diversas situaciones, y ahora los prefiero al operador sugerido, me temo.

Otros consejos

A primera vista se me ocurren tres razones:

  1. Es frágil. Si alguien decide cambiar el orden de la enumeración, entonces usted va a terminar con las funciones erróneas siendo llamados.
  2. Es no evidente. No puedo entender qué función se ejecutará en cuyo caso, sin cambiar a la definición de enumeración y verificaciones que ordenan las enumeraciones están en.
  3. Cada característica se inicia con menos de 100 puntos. Algo como esto es poco probable que justifique el esfuerzo requerido a las especificaciones, construir, documentar y probar, sobre todo si se compara con otras características, y especialmente en especial cuando hay una alternativa muy viable ya en el lenguaje.

C # toma prestado sintaxis de C ++ y C ++ toma prestado sintaxis de C y C no tienen un operador de ???:::, porque K & R, probablemente, no se sentía como si hubiera sido necesario. No es un "operador inútil", pero que sería considerado el azúcar sintáctica.

Por otra parte, no es una buena idea para que un operador se basan en el orden particular de las constantes en la declaración enum.

condición se evalúa a verdadero o falso. Lo que se propone el algoritmo de su operador no existente? Es difícil decir si puede ser útil o no, pero switch de los casos puede hacer lo que necesita.

El problema principal - aparte de que es insegura e innecesaria, y probablemente puede leer en la mayoría de casos reales -. Es que promueve un modelo de programación que la mayoría de la gente en estos días lo que se refiere tan malo

La mayoría de los lenguajes de programación tienen / estilos de diseño que permiten y los que quieren promover. C # permite la programación imperativa y de procedimiento, sino que promueve el uso de técnicas orientadas a objetos. Su operador pertenece firmemente en el primer campo y no es algo que los diseñadores de la lengua querrían apoyar.

Si se quería programar en ese estilo, entonces usted podría usar:

    myValue = (f == Fruit.apple) ? fnApple() 
            : (f == Fruit.mango) ? fnMango()
            : fnOrange();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top