Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Can a `default` case also be in the middle or on the beginning of a switch?

I have some switch-case blocks. Which do have a default case.

The default is normally placed at the "end" of the switch section. Like in ths example

switch(n)
{
    case(1): 
        // code for case 1 here...
        break;
    case(3): 
        // code for case 3 here...
        break;
    case(2):
    default: 
        // code here is for default and case 2
        break;
}

I know that the case (2) could be ommit, but we in the team decided to keep all possible cases in the switch.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

On the other-side I would love to have the order of 1, 2 and 3.

So my question would be, can I move the default in the middle of the switch? I found on msdn – the-switch-statement that the default can be placed everywhere.

The default case can appear in any place within a switch statement. Regardless of its position, the default case is always evaluated last and only if all other case patterns aren’t matched, except if goto default is encountered.

switch(n)
{
    case(1): 
        // code for case 1 here...
        break;
    case(2):
    default: 
        // code here is for default and case 2
        break;
    case(3): 
        // code for case 3 here...
        break;
}

Or would it be possible even possible to change the order or case(2) and default?

switch(n)
{
    case(1): 
        // code for case 1 here...
        break;
    default: 
    case(2):
        // code here is for default and case 2
        break;
    case(3): 
        // code for case 3 here...
        break;
}

The last code snippet, keeps the "order" and also shows that "2" is same as default. I like that most for readability.

My question, is the placement of "default" in the middle of the switch block save? Or was that introduced in later c# version?

From the comments … I added my test-method

        [TestMethod]
        public void SwitchMethodWithDefaultsInMiddle()
        {
            Func<int, string> func = (n) => {
                string ret = "";
                switch (n)
                {
                    case (1):
                        // code for case 1 here...
                        ret = "case 1";
                        break;
                    default:
                    case (2):
                        // code here is for default and case 2
                        ret = "case 2 or default";
                        break;
                    case (3):
                        // code for case 3 here...
                        ret = "case 3";
                        break;
                }
                return ret;
            };

            Assert.AreEqual("case 1", func(1));
            Assert.AreEqual("case 2 or default", func(2));
            Assert.AreEqual("case 3", func(3));

            Assert.AreEqual("case 2 or default", func(0));
            Assert.AreEqual("case 2 or default", func(4));
        }

May I do rephrase my question: Is that code "ok" for all c# versions, not only for my current one? My current code should be part of code-docu / guide-lines, so may someone with older VS or C# version is picking it up.

>Solution :

The ECMA 334 C# specification 1st edition from 2001 has an example of exactly this on p187, section 15.7.2:

32 switch (i) {
33 default:
34    CaseAny();
35    break;
36 case 1:
37    CaseZeroOrOne();
38    goto default;
39 case 0:
40    CaseZero();
41    goto case 1;
42 } 

so: it has always been valid

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading