2016-12-12 6 views
1

私はちょうどmanny Cases and Switchesでプログラムを書いた。 C#ではCasesやSwitchesを避ける方法はありますか?私は私の視点で、「ちょっとした」プログラムのようなもので終わった。他のすべてのシニアのフル・スタック・デベロッパーは、それはいいと言っていました。についてC#のケースとスイッチは本当に必要ですか?

しかし、基本的に私はこの問題のあなたの考えについて興味がありますか?あなたはCases and Switchesなしでスマートなコーディングを行うためのより良い方法を知っていますか?

基本的には、現状を事を疑問に私の自然の中でです....

+2

それはあなたがコーディングされているかに依存し、switch文は、「スマートコーディング」を定義し、クリーンで効率的な – BugFinder

+1

です。スイッチ/ケースブロックは、C#言語仕様の他のすべてと同じように、ツールです。それは他の何かがより適しているのに理想的な場所や他の場所を持っています。私はあなたがそれらを入れ子にしてはいけないと言います。 – Abion47

+0

それは異なります。多くのケースがあり、将来的にケースが追加される可能性がある場合は、ルックアップテーブルの形式が適している可能性があります。 –

答えて

4

それぞれの特定の場合には、自身の個人的な決定を必要とします。何百行ものダミールックアップコードが、複雑なカップルオブラインの複雑なロジックを再帰、第三者への参照、LINQなどの目的よりもはるかに優れたものにするケースがあります。

しかし、私は辞書を提案することができます代替案について話:あなたはあなたのクラスの使用の継承を試すことができます

switchCaseAlternative["case1"](); 
+1

完璧なことは一度も見たことないので、今私は家に帰ってそれについて読むことになります。 – Andy

+0

それは本当にクールなことです - 私はこれも見たことがありません。私はこれを覚えています! – TripleEEE

+1

これはエレガントな選択肢ですが、私はこれを勧めているかどうかはわかりません。唯一の選択肢は、プログラムが実行時にcase文を動的に追加している場合です。さもなければ、これは大メモリフットプリントと悪い性能のために(それほどそうでなければ)厄介です。 – Abion47

2

var switchCaseAlternative = new Dictionary<string, Action>() 
{ 
    {"case1",() => {System.Diagnostic.Debug.WriteLine("One");}}, 
    {"case2",() => {System.Diagnostic.Debug.WriteLine("Two");}} 
}; 

その後、使用する命令は次のようになります。スイッチとは、異なる値と同じようなことをする必要があることを意味します。希望、以下その一例が、私の考えを理解するのに役立ちます。

public enum SexTypes { Unknown, Male, Female } 

public abstract class Human 
{ 
    protected string HelloMessage = "common message part"; 
    public abstract SexTypes Sex { get; } 

    public void SayHello() => Console.WriteLine(HelloMessage); //good way 

    public void SayHelloWithSwitch() //bad way 
    { 
     switch(Sex) 
     { 
      case SexTypes.Unknown: 
       Console.WriteLine(HelloMessage); 
       break; 
      case SexTypes.Male: 
       Console.WriteLine(HelloMessage + " some modifications"); 
       break; 
      case SexTypes.Female: 
       Console.WriteLine("new other message"); 
       break; 
      default: 
       throw new ArgumentOutOfRangeException(); 
     } 
    } 
} 

public class Boy : Human 
{ 
    public override SexTypes Sex => SexTypes.Male; 
    protected new string HelloMessage => base.HelloMessage += " , some message modifications"; 
} 

public class Girl : Human 
{ 
    public override SexTypes Sex => SexTypes.Female; 
    protected new string HelloMessage = "overwrite all message"; 
} 
関連する問題