2009-03-06 3 views
0

は、それは私が2つのメンバ列挙型をした非常に多く発生します。このように2要素の列挙型が残っていると仮定しますか?

 enum E{ 
      A, 
      B 
     } 

のは、私は私の列挙型の値に応じて私に異なる値を割り当てたいとしましょう。

 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#でコードを投稿しましたが、この質問は言語に関連していません。

どのようにタグ付けする必要があるか分かりませんが、必要に応じてタグを付け直すことを躊躇しないでください。

編集:おそらく私の疑問は十分にはっきりしていない:私は私のenumが決して変わらず速い方法で行くと仮定すべきか、まだ変更していない)、何らかのエラー処理コードを追加してバグがどこにあるかを追跡するのに何週間も費やさないようにしてください)

答えて

1

値が追加されると文が追加されやすくなります他のスイッチステートメントよりもswitchステートメントに適用されます。

+0

でも、12行ではなく12行です。 – Brann

1

本当にというのは、異なる言語が列挙型を異なる方法で扱うため、言語に関連するです。

最初のバージョンは、エラー処理のために他の2つのバージョンと大きく異なります。あなたは本当にそれはどちらもAだもBは、単に使用している場合(この場合は)何が起こるか気にしない場合:あなたが出てほしいint型の値が直接一致しない場合

int i = (int) e; 

、私はどちらかのために行くだろうswitch文を使用することもできますし、ディクショナリを使用することもできます(C#3.0コレクション初期化子ではよりコンパクトなコードになりますが、例外が発生しても問題ない場合は引数を自由に指定できます)。

+0

@Jon:どのような変更がエラー処理であるか分かります。私はconcisionのためにエラー処理を落とすことが大丈夫かどうか疑問に思っています。 – Brann

+0

それは完全に状況に依存します。メソッドが自分のコード内で呼び出されていて、すでに有効であることがわかっている値を持つ場合は、引数を検証しないことが妥当です。他のコードから呼び出された場合は、おそらく検証する必要があります。私はおそらく他の何よりも前にそれをやるだろう。 –

3

メンテナンスの観点から、私は最初のオプションを潜在的なバグと見て、それをより明示的にするためにcase文にします。私はそれがコードの寿命に左右されていると思っています。長くするほど長くするほど明示的にするべきです。

0

最後の1つはベストプラクティスです。より読みやすく、保守性が向上しています。 と最初のものを使用しないでください!

関連する問題