Frage

Nur aus Neugier und fragen Sie dies

Wie der Ausdruck eins unten

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

Warum können wir keinen Operator für Enums haben?
sagen,

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

Anstelle von Switch -Aussagen (obwohl Refactoring möglich ist)


enum Fruit
{
    apple,
    mango,
    orange      
};

Fruit f = Fruit.apple;

Oder ist es eine Art nutzloser Betreiber?

War es hilfreich?

Lösung

Ich kann nicht sagen, dass ich jemals einen solchen Bediener wollte - was unglaublich spröde wäre, wenn ich auf die Bestellung der Enum -Werte stützt. Sie können problemlos einen Switch verwenden:

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

Erstellen Sie alternativ eine Karte:

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

myValue = FruitFunctions[f]();

Ich fürchte, ich habe beide Techniken in verschiedenen Situationen verwendet und bevorzuge sie dem vorgeschlagenen Operator.

Andere Tipps

Offhand kann ich mir drei Gründe vorstellen:

  1. Es ist spröde. Wenn jemand beschließt, die Aufzählung neu zu ordnen, werden Sie am Ende die falschen Funktionen erhalten.
  2. Es ist nicht offen. Ich kann nicht verstehen, welche Funktion ausgeführt wird. In diesem Fall wechseln Sie auf die Enum -Definition und überprüfen Sie, in welcher Reihenfolge sich die Aufträge befinden.
  3. Jede Funktion beginnt mit Minus 100 Punkten. Es ist unwahrscheinlich Besonders vor allem Wenn es bereits eine sehr praktikable Alternative in der Sprache gibt.

C# borrows syntax aus c ++ und c ++ studiert syntax aus c, und c hatte nicht a ???::: Betreiber, weil K & R wahrscheinlich nicht das Gefühl hatte, dass es notwendig war. Es ist kein "nutzloser Operator", aber es würde als syntaktischer Zucker angesehen.

Darüber hinaus ist es keine gute Idee für einen Betreiber, sich auf die jeweilige Bestellung von Konstanten in der Enum -Erklärung zu verlassen.

Die Bedingung wird auf wahr oder falsch bewertet. Was ist der vorgeschlagene Algorithmus Ihres nicht existierenden Operators? Es ist schwer zu sagen, ob es nützlich sein kann oder nicht, aber Switch-Case kann das tun, was Sie brauchen.

Das Hauptproblem - abgesehen davon, dass es in den meisten realen Fällen unsicher, unnötig und wahrscheinlich unleserlich ist - ist, dass es ein Programmiermodell fördert, das die meisten Menschen heutzutage als schlecht betrachten würden.

Die meisten Sprachen haben Programmier-/Designstile, die sie zulassen und die sie bewerben möchten. C# ermöglicht eine imperative und prozedurale Programmierung, fördert jedoch die Verwendung objektorientierter Techniken. Ihr Betreiber gehört fest in das erste Lager und ist nicht etwas, das die Designer der Sprache unterstützen möchten.

Wenn Sie in diesem Stil programmieren wollten, können Sie verwenden:

    myValue = (f == Fruit.apple) ? fnApple() 
            : (f == Fruit.mango) ? fnMango()
            : fnOrange();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top