Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# switch: case not falling through to other cases limitation

This question is kind of an add-on to this question

In C#, a switch case cannot fall through to other cases, this causes a compilation error. In this case I am just adding some number to the month total for the selected month and each subsequent month thereafter. (simple example, not meant to be real)

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

Is there a logical alternative to this in C# without having to write out a ton of if statements?

if (month <= 0)
   add something to month
if (month <= 1)
   add something to month
if (month <= 2)
   add something to month
.... etc
like image 578
Mike Fielden Avatar asked Sep 09 '08 16:09

Mike Fielden


4 Answers

Often times when you see the noise from a huge switch statement or many if statements that might fall into more than one block, you're trying to suppress a bad design.

Instead, what if you implemented the Specification pattern to see if something matched, and then act on it?

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

then you can just add up different specs that match what you're trying to do.

It's hard to tell what your domain is, so my example might be a little contrived.

like image 129
Ben Scheirman Avatar answered Oct 02 '22 14:10

Ben Scheirman


In C# switch statements you can fall through cases only if there is no statement for the case you want to fall through

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

However if you want to fall through with a statement you must use the dreaded GOTO

switch(myVar)
    {
       case 1: // Case 1 statement
               goto case 2;
       case 2: // Case 1 or 2 get here
          break;
    }
like image 32
jwarzech Avatar answered Oct 02 '22 16:10

jwarzech


Are you adding constants? If so, maybe something like this would work(C syntax):

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

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

You can do a similar thing with variable or function pointers if you need more complex statements than add constant to totals for each month following.

-Adam

like image 40
Adam Davis Avatar answered Oct 02 '22 14:10

Adam Davis


There is already a question addressing this topic:

C# switch statement limitations - why?

EDIT:

My main purpose in pointing that out, gentlebeasts, is that two questions of near-identical name add confusion to the pool of questions.

like image 30
Brian Warshaw Avatar answered Oct 02 '22 16:10

Brian Warshaw