Question

Juste par curiosité, demandant ce

Comme l'expression ci-dessous un

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

pourquoi ne pouvons-nous avoir un opérateur pour énumérations?
disons,

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

au lieu des états de commutation (même si refactoring est possible)


enum Fruit
{
    apple,
    mango,
    orange      
};

Fruit f = Fruit.apple;

Ou est-ce une sorte d'opérateur inutile?

Était-ce utile?

La solution

Je ne peux pas dire que je l'ai toujours voulu un tel opérateur - qui serait incroyablement fragile en se basant sur l'ordre des valeurs ENUM. Vous pouvez facilement utiliser un commutateur:

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

Vous pouvez également créer une carte:

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

myValue = FruitFunctions[f]();

Je l'ai utilisé deux techniques dans diverses situations, et de loin les préfère à l'opérateur suggéré, je le crains.

Autres conseils

Spontanément je peux penser à trois raisons:

  1. Il est fragile. Si quelqu'un décide de réorganiser la ENUM, vous vous retrouverez avec les mauvaises fonctions appelés.
  2. Il est non évidente. Je ne comprends pas quelle fonction fonctionnera dans ce cas, sans passage à la définition et le contrôle de ENUM quel ordre les énumérations sont.
  3. Chaque fonction commence par moins 100 points. Quelque chose comme il est peu probable pour justifier l'effort requis pour spec, construire, documenter et tester, en particulier par rapport à d'autres fonctions, et en particulier en particulier quand il y a une alternative très viable déjà dans la langue.

C # emprunte la syntaxe de C ++ et C ++ syntaxe de C emprunte et C n'a pas d'opérateur de ???:::, parce que K & R probablement ne se sentaient pas comme il fallait. Ce n'est pas un « opérateur inutile », mais il serait considéré comme le sucre syntaxique.

De plus, ce n'est pas une bonne idée pour un opérateur de compter sur l'ordre particulier des constantes dans la déclaration enum.

condition est évaluée à vrai ou faux. Ce qui est proposé algorithme de votre opérateur non existant? Il est difficile de dire s'il peut être utile ou non, mais changer cas peut faire ce que vous avez besoin.

Le principal problème - en dehors du fait qu'elle est dangereuse, inutile, et probablement illisible dans la plupart des cas réels -. Est qu'il favorise un modèle de programmation que la plupart des gens seraient ces jours-ci considèrent comme mauvais

La plupart des langues ont des styles de programmation / conception qu'ils permettent et ceux qu'ils veulent promouvoir. C # permet la programmation impérative et procédurale, mais encourage l'utilisation des techniques orientées objet. Votre opérateur appartient fermement dans le premier camp et n'est pas quelque chose que les concepteurs de la langue voudraient soutenir.

Si vous ne voulez programmer dans ce style, vous pouvez utiliser:

    myValue = (f == Fruit.apple) ? fnApple() 
            : (f == Fruit.mango) ? fnMango()
            : fnOrange();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top