質問

う好奇心から、この

のような表現は以下

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

ができないのはなぜでしたオペレーターのためのenums?

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. この欠点を持つ。自分がその気にさえなれば決双方向の内部状態を表示しますenum了し、管理状態の行き届いての誤った機能が呼び出されます。
  2. この非自明である。いるかを理解する機能を実行する場合の切り替えなしの列挙型の定義および確認のためにenumsています。
  3. 全ての特色が始まりマイナス100ポイント。 のようなことは考えを正当化するのに必要なスペックを構築し、文書および試験では、その特徴は、 特に、特に の場合は高いが既に開されたものの翻訳であります。

C#がC ++から構文を借りて、C ++はCから構文を借りて、それが必要だったようにK&Rは、おそらく感じなかったので、Cは、???:::演算子を持っていませんでした。それは「役に立たない演算子」ではないのですが、それはシンタックスシュガーと考えられる。

また、それが列挙型の宣言で定数の特定の順序に依存するオペレータのための良いアイデアではありません。

条件がtrueまたはfalseに評価されます。あなたの非既存事業者の提案したアルゴリズムは何ですか?便利であってもなくてもよいかどうかを言うのは難しいですが、スイッチケースは、あなたが必要なものを行うことができます。

主な問題は、 - 離れてそれが最も現実の例では、危険な不要な、そしておそらく読めないことから - それはほとんどの人がこれらの日の点が悪いだろうプログラミングモデルを促進することである。

ほとんどの言語は、彼らができるようにプログラミング/設計スタイルを持っており、それらは彼らが推進したいです。 C#が不可欠と手続き型プログラミングを可能にするが、オブジェクト指向技術の使用を推進しています。あなたのオペレータは、しっかりと最初のキャンプに属し、言語の設計者がサポートしたいと思うものではありません。

あなたはそのスタイルでプログラムしたいなかった場合、あなたが使用することができます:

    myValue = (f == Fruit.apple) ? fnApple() 
            : (f == Fruit.mango) ? fnMango()
            : fnOrange();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top