5

この質問は、この質問へのアドオンのようなものです

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;
}

大量の if ステートメントを書き出さなくても、C# でこれに代わる論理的な方法はありますか?

if (month <= 0)
   add something to month
if (month <= 1)
   add something to month
if (month <= 2)
   add something to month
.... etc
4

5 に答える 5

11

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

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

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

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

あなたのドメインが何であるかを伝えるのは難しいので、私の例は少し不自然かもしれません.

于 2008-09-09T16:40:09.113 に答える
8

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;
    }
于 2008-09-09T17:18:43.187 に答える
1

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

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

編集:

それを指摘する私の主な目的は、ほとんど同じ名前の 2 つの質問が質問のプールに混乱をもたらすことです。

于 2008-09-09T16:37:24.083 に答える
1

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

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

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

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

-アダム

于 2008-09-09T16:42:42.573 に答える
0

スイッチケースを逆順に書く

case 2:

case 1:

case 0:

break;


default:

それが役立つことを願っています!

于 2010-04-01T23:45:41.977 に答える