Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. Other Discussions
  3. The Weird and The Wonderful
  4. Switch boolean.... (reinventing if, unnecessarily)

Switch boolean.... (reinventing if, unnecessarily)

Scheduled Pinned Locked Moved The Weird and The Wonderful
47 Posts 32 Posters 6 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • R Rob Grainger

    Came across this kind of code today...

    void EnableFromValue(bool enabled)
    {
    switch (enabled) {
    case true:
    FirstControl.Enabled = true;
    SecondControl.Enabled = true;
    ...
    break;
    case false:
    FirstControl.Enabled = false;
    SecondControl.Enabled = false;
    ...
    break;
    }
    }

    I'm sure there must be a better way ;-)

    "If you don't fail at least 90 percent of the time, you're not aiming high enough." Alan Kay.

    S Offline
    S Offline
    Simon ORiordan from UK
    wrote on last edited by
    #11

    The advantage of a switch is that it bails as soon as a test passes, thus reducing conditional branching. Here you could use an if else.

    S L S 3 Replies Last reply
    0
    • S Simon ORiordan from UK

      The advantage of a switch is that it bails as soon as a test passes, thus reducing conditional branching. Here you could use an if else.

      S Offline
      S Offline
      ScottM1
      wrote on last edited by
      #12

      Or take it out altogether as it's setting 2 Booleans.

      1 Reply Last reply
      0
      • S Simon ORiordan from UK

        The advantage of a switch is that it bails as soon as a test passes, thus reducing conditional branching. Here you could use an if else.

        L Offline
        L Offline
        Lost User
        wrote on last edited by
        #13

        In that case it has the same advantage as the "if" would have; but if that is an important 'optimization', then you already have a bigger problem :)

        Bastard Programmer from Hell :suss: If you can't read my code, try converting it here[^][](X-Clacks-Overhead: GNU Terry Pratchett)

        S 1 Reply Last reply
        0
        • R Rob Grainger

          Came across this kind of code today...

          void EnableFromValue(bool enabled)
          {
          switch (enabled) {
          case true:
          FirstControl.Enabled = true;
          SecondControl.Enabled = true;
          ...
          break;
          case false:
          FirstControl.Enabled = false;
          SecondControl.Enabled = false;
          ...
          break;
          }
          }

          I'm sure there must be a better way ;-)

          "If you don't fail at least 90 percent of the time, you're not aiming high enough." Alan Kay.

          M Offline
          M Offline
          mbb01
          wrote on last edited by
          #14

          The only reason I could think for writing or keeping the code this way would be if enabled became an enumerated type and had more than 2 states.

          D 1 Reply Last reply
          0
          • L Lost User

            In that case it has the same advantage as the "if" would have; but if that is an important 'optimization', then you already have a bigger problem :)

            Bastard Programmer from Hell :suss: If you can't read my code, try converting it here[^][](X-Clacks-Overhead: GNU Terry Pratchett)

            S Offline
            S Offline
            Simon ORiordan from UK
            wrote on last edited by
            #15

            In my experience Microsoft is pretty much immune to optimisation. You can reduce branching by one or two orders of magnitude and the crappy performance just doesn't budge. :zzz:

            L 1 Reply Last reply
            0
            • M mbb01

              The only reason I could think for writing or keeping the code this way would be if enabled became an enumerated type and had more than 2 states.

              D Offline
              D Offline
              Daniel Pfeffer
              wrote on last edited by
              #16

              In that case - create it as an enumerated type, with two values. You may then expand the enumeration without rewriting the existing code.

              If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack. --Winston Churchill

              1 Reply Last reply
              0
              • S Simon ORiordan from UK

                In my experience Microsoft is pretty much immune to optimisation. You can reduce branching by one or two orders of magnitude and the crappy performance just doesn't budge. :zzz:

                L Offline
                L Offline
                Lost User
                wrote on last edited by
                #17

                Probably because it is a micro-optimization; you won't notice much difference if it merely saves you the toggeling of a boolean.

                Bastard Programmer from Hell :suss: If you can't read my code, try converting it here[^][](X-Clacks-Overhead: GNU Terry Pratchett)

                S 1 Reply Last reply
                0
                • L Lost User

                  Probably because it is a micro-optimization; you won't notice much difference if it merely saves you the toggeling of a boolean.

                  Bastard Programmer from Hell :suss: If you can't read my code, try converting it here[^][](X-Clacks-Overhead: GNU Terry Pratchett)

                  S Offline
                  S Offline
                  Simon ORiordan from UK
                  wrote on last edited by
                  #18

                  Ha! It was actually an image processing filter mask which used pointer arithmetic. I invented something I called a Summation Threshold Filter which should have been ten times quicker than a Median filter. Let's just say that this was not apparent. :laugh:

                  1 Reply Last reply
                  0
                  • S Simon ORiordan from UK

                    The advantage of a switch is that it bails as soon as a test passes, thus reducing conditional branching. Here you could use an if else.

                    S Offline
                    S Offline
                    Scott Corbett
                    wrote on last edited by
                    #19

                    Umm...that's not true. A switch will continue to fall through until you get to a break statement or the end of the switch (i.e. the default case.) On the other hand, if/else statements do bail as soon as the first passing conditional is found and the associated code block is executed.

                    Scott E. Corbett

                    Richard DeemingR T S 3 Replies Last reply
                    0
                    • R Rob Grainger

                      Came across this kind of code today...

                      void EnableFromValue(bool enabled)
                      {
                      switch (enabled) {
                      case true:
                      FirstControl.Enabled = true;
                      SecondControl.Enabled = true;
                      ...
                      break;
                      case false:
                      FirstControl.Enabled = false;
                      SecondControl.Enabled = false;
                      ...
                      break;
                      }
                      }

                      I'm sure there must be a better way ;-)

                      "If you don't fail at least 90 percent of the time, you're not aiming high enough." Alan Kay.

                      M Offline
                      M Offline
                      Member 9908362
                      wrote on last edited by
                      #20

                      FirstControl.Enabled = !FirstControl.Enabled;
                      SecondControl.Enabled = !SecondControl.Enabled;

                      1 Reply Last reply
                      0
                      • R Rob Grainger

                        That's the gist of it yep. This is in an MVVM app, using a framework I architected. Sadly, one of the dev's has a habit of naming View Model fields too literally after the thing in the View, so it still ends up looking like code manipulating the view directly (and at the other extreme, a hell of a lot of business logic has polluted the view model). So, while the controls may not be called "FirstControl" etc., its really not that far off - properties with names like "CustomerListBoxSelectedCustomer". I try to clear up as much as I can as I work with stuff, but it seems some people just don't want to learn to work with architecture.

                        "If you don't fail at least 90 percent of the time, you're not aiming high enough." Alan Kay.

                        K Offline
                        K Offline
                        Kirk 10389821
                        wrote on last edited by
                        #21

                        Code Reviews Code Reviews Code Reviews Here is a great rule. When someone gets multiple "mandatory" changes needing to be made as a result of a Code Review. Then you must review weekly, ALL of their code. This continues until they no longer require "mandatory" changes for a few weeks in a row. The goals are: 1) Slow them down 2) Get them to proactively ask people how they should code/name something 3) Show them the right way (for your group) to do things Our Code Reviews have 3 Comment Levels: - Mandatory: We will not let this stand in production, must be rewritten - Suggested: We are not thrilled, but if you can "really" defend it. - Noted: We are just making a note, take it or leave it (Variable names, Variable comments) Make Code Reviews fun. Friday starting at lunch time with pizza brought in. It helps you to detach from the depth of coding for the weekend. Besides, Code Reviews are how Good Developers help new Developers!

                        1 Reply Last reply
                        0
                        • F Freak30

                          I see a reason for the function but not for the switch statement. Except if you are paid by lines of code of course. :-D

                          The good thing about pessimism is, that you are always either right or pleasently surprised.

                          J Offline
                          J Offline
                          Jeremy Falcon
                          wrote on last edited by
                          #22

                          Totally agree.

                          Jeremy Falcon

                          1 Reply Last reply
                          0
                          • S Scott Corbett

                            Umm...that's not true. A switch will continue to fall through until you get to a break statement or the end of the switch (i.e. the default case.) On the other hand, if/else statements do bail as soon as the first passing conditional is found and the associated code block is executed.

                            Scott E. Corbett

                            Richard DeemingR Offline
                            Richard DeemingR Offline
                            Richard Deeming
                            wrote on last edited by
                            #23

                            Scott Corbett wrote:

                            A switch will continue to fall through until you get to a break statement or the end of the switch (i.e. the default case.)

                            Not in C# - every case is required to have a terminating statement (break, goto, return or throw).

                            switch (C# Reference)[^]:

                            Unlike C++, C# does not allow execution to continue from one switch section to the next. ... C# requires the end of switch sections, including the final one, to be unreachable. That is, unlike some other languages, your code may not fall through into the next switch section.


                            "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

                            "These people looked deep within my soul and assigned me a number based on the order in which I joined" - Homer

                            S 1 Reply Last reply
                            0
                            • R Rob Grainger

                              Came across this kind of code today...

                              void EnableFromValue(bool enabled)
                              {
                              switch (enabled) {
                              case true:
                              FirstControl.Enabled = true;
                              SecondControl.Enabled = true;
                              ...
                              break;
                              case false:
                              FirstControl.Enabled = false;
                              SecondControl.Enabled = false;
                              ...
                              break;
                              }
                              }

                              I'm sure there must be a better way ;-)

                              "If you don't fail at least 90 percent of the time, you're not aiming high enough." Alan Kay.

                              B Offline
                              B Offline
                              Basketcase Software
                              wrote on last edited by
                              #24

                              Couldn't resist:

                              void EnableFromValue(bool enabled)
                              {
                              FirstControl.Enabled = enabled;
                              SecondControl.Enabled = enabled;
                              ...
                              }

                              1 Reply Last reply
                              0
                              • S Scott Corbett

                                Umm...that's not true. A switch will continue to fall through until you get to a break statement or the end of the switch (i.e. the default case.) On the other hand, if/else statements do bail as soon as the first passing conditional is found and the associated code block is executed.

                                Scott E. Corbett

                                T Offline
                                T Offline
                                ttennebb
                                wrote on last edited by
                                #25

                                I believe a switch is just a calculated jump statement. It doesn't work it's way through all the previous possibilities. Yes. Once calculated, the program goes to the break statement then jumps out appropriately. Switch statements are quite fast. In this case, I don't see advantage either way as an if statement is very simple too.

                                1 Reply Last reply
                                0
                                • R Rob Grainger

                                  Came across this kind of code today...

                                  void EnableFromValue(bool enabled)
                                  {
                                  switch (enabled) {
                                  case true:
                                  FirstControl.Enabled = true;
                                  SecondControl.Enabled = true;
                                  ...
                                  break;
                                  case false:
                                  FirstControl.Enabled = false;
                                  SecondControl.Enabled = false;
                                  ...
                                  break;
                                  }
                                  }

                                  I'm sure there must be a better way ;-)

                                  "If you don't fail at least 90 percent of the time, you're not aiming high enough." Alan Kay.

                                  J Offline
                                  J Offline
                                  Javier jimenez Rico
                                  wrote on last edited by
                                  #26

                                  it is simple : void EnableFromValue(bool ?enabled) { FirstControl.Enabled=enabled.HasValue?enabled.Value:false; SecondControl.Enabled=enabled.HasValue?enabled.Value:false; }

                                  M 1 Reply Last reply
                                  0
                                  • J Javier jimenez Rico

                                    it is simple : void EnableFromValue(bool ?enabled) { FirstControl.Enabled=enabled.HasValue?enabled.Value:false; SecondControl.Enabled=enabled.HasValue?enabled.Value:false; }

                                    M Offline
                                    M Offline
                                    Member 11594914
                                    wrote on last edited by
                                    #27

                                    This works for me FirstControl.Enabled = SecondControl.Enabled = (enabled) ? false : true;

                                    D 1 Reply Last reply
                                    0
                                    • F Freak30

                                      I see a reason for the function but not for the switch statement. Except if you are paid by lines of code of course. :-D

                                      The good thing about pessimism is, that you are always either right or pleasently surprised.

                                      B Offline
                                      B Offline
                                      Bruce Patin
                                      wrote on last edited by
                                      #28

                                      I have code like that. It is the "..." that is significant. For some objects, you can't just set enable = false, you have to do other things. And, in some cases, one switch branch will enable some fields and disable others.

                                      J 1 Reply Last reply
                                      0
                                      • S Silvabolt

                                        So better way is this?

                                        FirstControl.Enabled = enabled;
                                        SecondControl.Enabled = enabled;

                                        or better yet, MVVM would help if applicable to the app.

                                        B Offline
                                        B Offline
                                        Bruce Patin
                                        wrote on last edited by
                                        #29

                                        I have code like that, but sometimes it is not so simple. Not all objects have an "enabled" property, and sometimes I may need to enable some and disable others. Keeping the switch, or at least an "if ... else" structure, makes for more clarity, just in case these oddball things are necessary.

                                        1 Reply Last reply
                                        0
                                        • M Member 11594914

                                          This works for me FirstControl.Enabled = SecondControl.Enabled = (enabled) ? false : true;

                                          D Offline
                                          D Offline
                                          DanKorn
                                          wrote on last edited by
                                          #30

                                          LOL! I recently went through my company's entire code base to purge out constructs such as "? true : false". Even more fun were comparisons such as "if (some_int_var == TRUE)". That's great unless, say "TRUE" is defined as 1 and your variable is set to -1.

                                          M 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups