0

私が2つのメンバーの列挙型を持っていることはかなり頻繁に起こります:

        enum  E{
            A,
            B
        }

列挙値に従って i に異なる値を割り当てたいとしましょう。

これを書くべきですか:

        int i= (e== E.A)?0:1;

またはこれ:

        int i;
        if (e==E.A)
            i=0;
        else if (e==E.B)
            i=1;
        else throw new NotImplementedException("Unknown enum member for E : " + e);

または多分これ:

        int i;
        switch (e)
        {
            case E.A:
                i = 0;
                break;
            case E.B:
                i=1;
                break;
            default:
                throw new NotImplementedException("Unknown enum member for E : " + e);
        }

書くのがずっと速いので、私は通常最初のオプションを選びますが、私はいつもそれについて少し間違っていると感じています. 普段何をしていますか?

コードは c# で投稿しましたが、この質問は言語に関連したものではありません。

どのようにタグ付けすればよいかよくわかりません。必要に応じてタグを付け直してください。

編集:多分私の質問は十分に明確ではありません:私が本当に疑問に思っているのは:私の列挙型が決して変更されず、速い方法で進むと仮定すべきか、それとも変更される可能性があると考えるべきか(私は変更していませんが)まだ)、エラー処理コードを追加して、バグが変更された場合にその場所を追跡するのに何週間も費やさないようにします)

4

4 に答える 4

3

メンテナンスの観点から、最初のオプションを潜在的なバグと見なし、それをケース ステートメントに変えて動作をより明確にします。それはコードの平均寿命に依存すると思います-コードが長く続くほど、より明示的にする必要があります。

于 2009-03-06T16:41:22.590 に答える
1

値が列挙型に追加された場合は、switch ステートメントにステートメントを追加する方が他のステートメントよりも簡単です。

于 2009-03-06T16:29:57.283 に答える
1

異なる言語では列挙型の処理が異なるため、質問は実際には言語に関連しています。

エラー処理が原因で、最初のバージョンは他の 2 つのバージョンとは大きく異なります。AでもBでもない場合に何が起こるかを本当に気にしない場合は、次を使用してください(この場合):

int i = (int) e;

必要な int 値が直接一致しない場合は、switch ステートメントを使用するか、場合によっては辞書を使用することもできます (これは遅くなりますが、C# 3.0 コレクション初期化子を使用したよりコンパクトなコードであり、引数チェックを提供します)。スローされる例外に満足している場合は無料です)。

于 2009-03-06T16:31:24.380 に答える