質問

この質問はこれに対する一種の追加です 質問

C# では、switch ケースは他のケースにフォールスルーできないため、コンパイル エラーが発生します。この場合、選択した月とその後の各月の合計に数値を追加するだけです。(単純な例であり、実際のものではありません)

switch (month)
{
    case 0:
      add something to month totals
    case 1:
      add something to month totals
    case 2:
      add something to month totals
    default:
      break;
}

C# で、大量の if ステートメントを記述せずにこれに代わる論理的な方法はありますか?

if (month <= 0)
   add something to month
if (month <= 1)
   add something to month
if (month <= 2)
   add something to month
.... etc
役に立ちましたか?

解決

多くの場合、巨大な switch ステートメントや、複数のブロックに分類される可能性のある多数の if ステートメントからノイズが発生する場合、不適切な設計を抑制しようとしていることがわかります。

代わりに、仕様パターンを実装して何かが一致するかどうかを確認し、それに基づいて行動したらどうなるでしょうか?

foreach(MonthSpecification spec in this.MonthSpecifications)
{
   if(spec.IsSatisfiedBy(month))
       spec.Perform(month);
}

次に、やろうとしていることに一致するさまざまな仕様を追加するだけです。

ドメインが何であるかを判断するのは難しいため、私の例は少し不自然かもしれません。

他のヒント

C# の switch ステートメントでは、フォールスルーしたいケースのステートメントがない場合にのみ、ケースをフォールスルーできます。

switch(myVar)
{
   case 1:
   case 2: // Case 1 or 2 get here
      break;
}

ただし、ステートメントを失敗させたい場合は、恐ろしい GOTO を使用する必要があります。

switch(myVar)
    {
       case 1: // Case 1 statement
               goto case 2;
       case 2: // Case 1 or 2 get here
          break;
    }

定数を追加していますか?もしそうなら、おそらく次のようなものが機能するでしょう(C構文):

const int addToTotals[] = {123, 456, ..., 789};

for(i=month;i<12;i++)
   totals += addToTotals[i];

後続の各月の合計に定数を加算するよりも複雑なステートメントが必要な場合は、変数または関数ポインターを使用して同様のことを行うことができます。

-アダム

このトピックに関する質問がすでにあります。

C# switch ステートメントの制限 - なぜですか?

編集:

ジェントルビーストの皆さん、私がこれを指摘する主な目的は、ほぼ同じ名前の 2 つの質問が質問群に混乱を加えているということです。

スイッチケースを逆の順序で書きます

case 2:

case 1:

case 0:

break;


default:

お役に立てば幸いです!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top