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. The Lounge
  3. The new GOTO Statement?

The new GOTO Statement?

Scheduled Pinned Locked Moved The Lounge
questionlinqhardwarealgorithmscollaboration
82 Posts 29 Posters 63 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.
  • L Lost User

    Bad Software languages breed bad software engineers....

    Computers have been intelligent for a long time now. It just so happens that the program writers are about as effective as a room full of monkeys trying to crank out a copy of Hamlet.

    C Offline
    C Offline
    CPallini
    wrote on last edited by
    #28

    I disagree. :)

    Veni, vidi, vici.

    F 1 Reply Last reply
    0
    • L lewax00

      var is great for foreach loops when you have long types like KeyValuePairs with a generic type for the value. I don't use it often outside that.

      OriginalGriffO Offline
      OriginalGriffO Offline
      OriginalGriff
      wrote on last edited by
      #29

      It's easier to type - but it doesn't make the code more readable! You have to check the type of the IEnumerable that the variable is declared from in order to find out what type you are using within the loop:

      foreach (var v in MyClass.Items)
      {
      ...
      }

      Or

      foreach (KeyValuePair<Guid, List<string>> kvp in MyClass.Items)
      {
      ...
      {

      (Not that I'm advocating using KeyValuePair<Guid, List<string>> directly anyway, you understand)

      Ideological Purity is no substitute for being able to stick your thumb down a pipe to stop the water

      "I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
      "Common sense is so rare these days, it should be classified as a super power" - Random T-shirt

      P L 2 Replies Last reply
      0
      • OriginalGriffO OriginalGriff

        Yes, I agree. Every element of a language has it's use - even goto and var in C#- it's just that if you use them inappropriately you get less readable code instead of more. Personally, I find lambdas are useful in their place, but I avoid using them most of the time. var should be banned outside Linq!

        Ideological Purity is no substitute for being able to stick your thumb down a pipe to stop the water

        B Offline
        B Offline
        BobJanova
        wrote on last edited by
        #30

        I quite like the use of 'var' when the thing to the right is clearly typed, e.g.

        var map = new Dictionary<string, int>();

        It was rather a failing in all C family languages that you had to write the type twice before when it's clearly there in the initialiser, and using var here is not hiding anything. I don't actually like it in Linq, it's too hard to see by inspection what the type of a Linq expression is. I quite like declaring those as IQueryable<whatever>.

        P 1 Reply Last reply
        0
        • E ekolis

          harold aptroot wrote:

          You can abuse switch in atrocious ways in C and C++ (case goes pretty much anywhere, it doesn't even look like valid syntax but it is)

          Are you saying that you can have a case statement without an enclosing switch? :wtf: What does THAT look like, and what would one use it for?

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

          Well it doesn't really go that far, but the case statements don't define any sort of block (they behave much the same way as labels) and (as long as it's somewhere in a switch) you can mix them with other control flow. For example, Duff's device[^], which mixes a switch and a do/while.

          E 1 Reply Last reply
          0
          • S sisnaz

            Perhaps embedded method is a loose term. This is what I'm referring to. In my opinion it reflects the same goto example you posted.

            public string ReturnSomething()
            {
            // ... some logic
            // ...
            var compare = new Func<string, string, string, string, bool>((compare1, compare2, compare3, compare4) =>
            {
            return (compare1.Equals(compare2, StringComparison.InvariantCultureIgnoreCase) &&
            compare3.Equals(compare4, StringComparison.InvariantCultureIgnoreCase));
            });

                    // some more logic flow
                    // ....
            
                    if (compare("a", "b", "c", "d")) {
                        // some logic
                    }
            
                    return "Something";
                }
            
            B Offline
            B Offline
            BobJanova
            wrote on last edited by
            #32

            compare is nothing more or less than a local method; this example is no less readable than the boring alternative:

            public string ReturnSomething()
            {
            // ... some logic
            // ...

                    // some more logic flow
                    // ....
            
                    if (compare("a", "b", "c", "d")) {
                        // some logic
                    }
            
                    return "Something";
                }
            

            private boolean compare(string compare1, string compare2, string compare3, string compare4) {
            return (compare1.Equals(compare2, StringComparison.InvariantCultureIgnoreCase) &&
            compare3.Equals(compare4, StringComparison.InvariantCultureIgnoreCase));
            }

            ... and arguably more so, if the method is only used in one place, because you're not gumming up the class scope with methods that are not relevant to any of it apart from one function. compare cannot affect the control flow of the containing function, it is a normal function which takes arguments and returns a result – it is just declared as a dynamic Func type for technical reasons. Delphi allows you to declare local methods statically for exactly this kind of situation, and (like so much in Delphi) that is a really good idea.

            1 Reply Last reply
            0
            • S sisnaz

              YES! I completely agree. I have a team member that declares EVERYTHING as var. He says it's because it makes it loosely coupled and also C Sharpner tells him too.

              S Offline
              S Offline
              Steve 2
              wrote on last edited by
              #33

              haha sounds like me. var is certainly not only nice for foreach loops or LINQ. I find it rather stupid to type something like:

              Dictionary>> stuff = /*sigh*/ new Dictionary>>();

              Yes, stupid indeed. And it's exactly that type of scenario the "var" keyword was made for.

              P F A K 4 Replies Last reply
              0
              • L Lost User

                Well it doesn't really go that far, but the case statements don't define any sort of block (they behave much the same way as labels) and (as long as it's somewhere in a switch) you can mix them with other control flow. For example, Duff's device[^], which mixes a switch and a do/while.

                E Offline
                E Offline
                ekolis
                wrote on last edited by
                #34

                Hmm, come to think of it, I recently discovered that in C#, you can declare a variable in one case block and use it in a subsequent case block!

                L 1 Reply Last reply
                0
                • OriginalGriffO OriginalGriff

                  Yes, I agree. Every element of a language has it's use - even goto and var in C#- it's just that if you use them inappropriately you get less readable code instead of more. Personally, I find lambdas are useful in their place, but I avoid using them most of the time. var should be banned outside Linq!

                  Ideological Purity is no substitute for being able to stick your thumb down a pipe to stop the water

                  F Offline
                  F Offline
                  Fabio Franco
                  wrote on last edited by
                  #35

                  OriginalGriff wrote:

                  var should be banned outside Linq!

                  There should be a compiler warning for using var anywhere else. The thing that bothers me the most is to read code that the lazy programmer put var everywhere. It is one of those language features that I really question whether it came for bad or for good. It's too much abused, specially by beginners that don't understand the porpose of var. In my opinion var should only be used to infer anonymous types and nothing else.

                  To alcohol! The cause of, and solution to, all of life's problems - Homer Simpson ---- Our heads are round so our thoughts can change direction - Francis Picabia

                  OriginalGriffO S 2 Replies Last reply
                  0
                  • S Steve 2

                    haha sounds like me. var is certainly not only nice for foreach loops or LINQ. I find it rather stupid to type something like:

                    Dictionary>> stuff = /*sigh*/ new Dictionary>>();

                    Yes, stupid indeed. And it's exactly that type of scenario the "var" keyword was made for.

                    P Offline
                    P Offline
                    PIEBALDconsult
                    wrote on last edited by
                    #36

                    Steve#2 wrote:

                    type of scenario the "var" keyword was made for.

                    Bullpuckey; it was made for Linq. That's exactly the scenario the using directive was made for:

                    using MyDic = Dictionary<int, List<Vec3<float>>> ;
                    ...
                    MyDic stuff = new MyDic() ;

                    (Except that generics cme later. :sigh: )

                    F S J 3 Replies Last reply
                    0
                    • S Steve 2

                      haha sounds like me. var is certainly not only nice for foreach loops or LINQ. I find it rather stupid to type something like:

                      Dictionary>> stuff = /*sigh*/ new Dictionary>>();

                      Yes, stupid indeed. And it's exactly that type of scenario the "var" keyword was made for.

                      F Offline
                      F Offline
                      Fabio Franco
                      wrote on last edited by
                      #37

                      Steve#2 wrote:

                      And it's exactly that type of scenario the "var" keyword was made for.

                      You're either joking or don't understand the purpose of var.

                      To alcohol! The cause of, and solution to, all of life's problems - Homer Simpson ---- Our heads are round so our thoughts can change direction - Francis Picabia

                      S 1 Reply Last reply
                      0
                      • S sisnaz

                        YES! I completely agree. I have a team member that declares EVERYTHING as var. He says it's because it makes it loosely coupled and also C Sharpner tells him too.

                        F Offline
                        F Offline
                        Fabio Franco
                        wrote on last edited by
                        #38

                        sisnaz wrote:

                        He says it's because it makes it loosely coupled

                        :doh:

                        To alcohol! The cause of, and solution to, all of life's problems - Homer Simpson ---- Our heads are round so our thoughts can change direction - Francis Picabia

                        1 Reply Last reply
                        0
                        • B BobJanova

                          I quite like the use of 'var' when the thing to the right is clearly typed, e.g.

                          var map = new Dictionary<string, int>();

                          It was rather a failing in all C family languages that you had to write the type twice before when it's clearly there in the initialiser, and using var here is not hiding anything. I don't actually like it in Linq, it's too hard to see by inspection what the type of a Linq expression is. I quite like declaring those as IQueryable<whatever>.

                          P Offline
                          P Offline
                          PIEBALDconsult
                          wrote on last edited by
                          #39

                          BobJanova wrote:

                          it's too hard to see by inspection what the type of a Linq expression is

                          And that's why var was created -- for times when you can't know the type when writing the code.

                          1 Reply Last reply
                          0
                          • P PIEBALDconsult

                            Steve#2 wrote:

                            type of scenario the "var" keyword was made for.

                            Bullpuckey; it was made for Linq. That's exactly the scenario the using directive was made for:

                            using MyDic = Dictionary<int, List<Vec3<float>>> ;
                            ...
                            MyDic stuff = new MyDic() ;

                            (Except that generics cme later. :sigh: )

                            F Offline
                            F Offline
                            Fabio Franco
                            wrote on last edited by
                            #40

                            PIEBALDconsult wrote:

                            Bullpuckey; it was made for Linq.

                            I'd just like to add that it was made for Linq because Linq generates a lot of anonymous types. It would be a hell to create classes for all possible result sets.

                            PIEBALDconsult wrote:

                            That's exactly the scenario the using directive was made for:

                            using MyDic = Dictionary<int, List<Vec3<float>>> ;
                            ...
                            MyDic stuff = new MyDic() ;

                            (Except that generics cme later. :sigh: )

                            Yeah, I'd say nothing was made for that so we do workarounds :) Or we could model our own classes that handle trickier business rules, I like to believe everyone is capable of that.

                            To alcohol! The cause of, and solution to, all of life's problems - Homer Simpson ---- Our heads are round so our thoughts can change direction - Francis Picabia

                            S D 3 Replies Last reply
                            0
                            • OriginalGriffO OriginalGriff

                              It's easier to type - but it doesn't make the code more readable! You have to check the type of the IEnumerable that the variable is declared from in order to find out what type you are using within the loop:

                              foreach (var v in MyClass.Items)
                              {
                              ...
                              }

                              Or

                              foreach (KeyValuePair<Guid, List<string>> kvp in MyClass.Items)
                              {
                              ...
                              {

                              (Not that I'm advocating using KeyValuePair<Guid, List<string>> directly anyway, you understand)

                              Ideological Purity is no substitute for being able to stick your thumb down a pipe to stop the water

                              P Offline
                              P Offline
                              PIEBALDconsult
                              wrote on last edited by
                              #41

                              OriginalGriff wrote:

                              It's easier to type - but it doesn't make the code more readable!

                              Hear hear! That's what so many developers don't seem to realize -- less typing tends toward less readable code. It's what I think is worst about the Unix crowd -- the idea that fewer keystrokes saves time. A stitch in time saves nine -- writing everything in detail up front saves time and effort down the road.

                              using GuidStringPair = KeyValuePair<Guid, List<string>>
                              ...
                              foreach (GuidStringPair kvp in MyClass.Items)
                              {
                              ...
                              {

                              1 Reply Last reply
                              0
                              • F Fabio Franco

                                OriginalGriff wrote:

                                var should be banned outside Linq!

                                There should be a compiler warning for using var anywhere else. The thing that bothers me the most is to read code that the lazy programmer put var everywhere. It is one of those language features that I really question whether it came for bad or for good. It's too much abused, specially by beginners that don't understand the porpose of var. In my opinion var should only be used to infer anonymous types and nothing else.

                                To alcohol! The cause of, and solution to, all of life's problems - Homer Simpson ---- Our heads are round so our thoughts can change direction - Francis Picabia

                                OriginalGriffO Offline
                                OriginalGriffO Offline
                                OriginalGriff
                                wrote on last edited by
                                #42

                                Absolutely! Overuse smacks of being too lazy to think about your datatypes, and is far too reminiscent of VB's Dim for my taste.

                                Ideological Purity is no substitute for being able to stick your thumb down a pipe to stop the water

                                "I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
                                "Common sense is so rare these days, it should be classified as a super power" - Random T-shirt

                                1 Reply Last reply
                                0
                                • P PIEBALDconsult

                                  Steve#2 wrote:

                                  type of scenario the "var" keyword was made for.

                                  Bullpuckey; it was made for Linq. That's exactly the scenario the using directive was made for:

                                  using MyDic = Dictionary<int, List<Vec3<float>>> ;
                                  ...
                                  MyDic stuff = new MyDic() ;

                                  (Except that generics cme later. :sigh: )

                                  S Offline
                                  S Offline
                                  Steve 2
                                  wrote on last edited by
                                  #43

                                  I don't think it was made just for LINQ, that's not what I've read in countless introdution texts about new features back then. What do you mean by "Except that generics cme later" ? Generics are there since .NET 2.0, var since 3.5 IIRC.

                                  P 1 Reply Last reply
                                  0
                                  • F Fabio Franco

                                    Steve#2 wrote:

                                    And it's exactly that type of scenario the "var" keyword was made for.

                                    You're either joking or don't understand the purpose of var.

                                    To alcohol! The cause of, and solution to, all of life's problems - Homer Simpson ---- Our heads are round so our thoughts can change direction - Francis Picabia

                                    S Offline
                                    S Offline
                                    Steve 2
                                    wrote on last edited by
                                    #44

                                    I think I do: automatic type inference. Which is what my example used them for.

                                    P 1 Reply Last reply
                                    0
                                    • F Fabio Franco

                                      PIEBALDconsult wrote:

                                      Bullpuckey; it was made for Linq.

                                      I'd just like to add that it was made for Linq because Linq generates a lot of anonymous types. It would be a hell to create classes for all possible result sets.

                                      PIEBALDconsult wrote:

                                      That's exactly the scenario the using directive was made for:

                                      using MyDic = Dictionary<int, List<Vec3<float>>> ;
                                      ...
                                      MyDic stuff = new MyDic() ;

                                      (Except that generics cme later. :sigh: )

                                      Yeah, I'd say nothing was made for that so we do workarounds :) Or we could model our own classes that handle trickier business rules, I like to believe everyone is capable of that.

                                      To alcohol! The cause of, and solution to, all of life's problems - Homer Simpson ---- Our heads are round so our thoughts can change direction - Francis Picabia

                                      S Offline
                                      S Offline
                                      Steve 2
                                      wrote on last edited by
                                      #45

                                      ah, you mean the using ^^ Haven't seen this usage of it, wow, yet another meaning of the keyword "using", I think now that's quite an abuse... (language design wise)

                                      K 1 Reply Last reply
                                      0
                                      • S Steve 2

                                        haha sounds like me. var is certainly not only nice for foreach loops or LINQ. I find it rather stupid to type something like:

                                        Dictionary>> stuff = /*sigh*/ new Dictionary>>();

                                        Yes, stupid indeed. And it's exactly that type of scenario the "var" keyword was made for.

                                        A Offline
                                        A Offline
                                        aojepojefpoejafpeoj
                                        wrote on last edited by
                                        #46

                                        And you have to type all that in C# for what reason? You have autocomplete, can't complain about having to type too much.

                                        S 1 Reply Last reply
                                        0
                                        • F Fabio Franco

                                          PIEBALDconsult wrote:

                                          Bullpuckey; it was made for Linq.

                                          I'd just like to add that it was made for Linq because Linq generates a lot of anonymous types. It would be a hell to create classes for all possible result sets.

                                          PIEBALDconsult wrote:

                                          That's exactly the scenario the using directive was made for:

                                          using MyDic = Dictionary<int, List<Vec3<float>>> ;
                                          ...
                                          MyDic stuff = new MyDic() ;

                                          (Except that generics cme later. :sigh: )

                                          Yeah, I'd say nothing was made for that so we do workarounds :) Or we could model our own classes that handle trickier business rules, I like to believe everyone is capable of that.

                                          To alcohol! The cause of, and solution to, all of life's problems - Homer Simpson ---- Our heads are round so our thoughts can change direction - Francis Picabia

                                          S Offline
                                          S Offline
                                          Steve 2
                                          wrote on last edited by
                                          #47

                                          [quote]I'd just like to add that it was made for Linq because Linq generates a lot of anonymous types. It would be a hell to create classes for all possible result sets.[/quote] Sounds like it makes sense. But "was made because of LINQ" sounds then more accurate than "made *for* LINQ", since automatic type inference is surely useful in other contexts.

                                          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