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. I still think the "var" in C# is a really bad idea

I still think the "var" in C# is a really bad idea

Scheduled Pinned Locked Moved The Lounge
csharp
34 Posts 23 Posters 38 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.
  • J jpg 0

    Consider this code:

    var num = MyMath.Add( 123, 789 );

    By just reading the code, you won't be able to know whether num is an int32, int16, float, double, or any other types. :^)

    D Offline
    D Offline
    dazfuller
    wrote on last edited by
    #16

    Agreed, in a typed language what's the point of not defining the type? If you don't want to define the type then use Python

    J 1 Reply Last reply
    0
    • J jpg 0

      Consider this code:

      var num = MyMath.Add( 123, 789 );

      By just reading the code, you won't be able to know whether num is an int32, int16, float, double, or any other types. :^)

      S Offline
      S Offline
      Stuart Dootson
      wrote on last edited by
      #17

      The specification of MyMath.Add is part of the code, right? So read that bit... And whatever you do, don't use a language like Haskell or Ocaml, which does real, powerful type deduction - it'll blow your mind...

      Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p CodeProject MVP for 2010 - who'd'a thunk it!

      1 Reply Last reply
      0
      • J jpg 0

        Consider this code:

        var num = MyMath.Add( 123, 789 );

        By just reading the code, you won't be able to know whether num is an int32, int16, float, double, or any other types. :^)

        A Offline
        A Offline
        Adriaan Davel
        wrote on last edited by
        #18

        I like var because it takes focus off the type, and places it on the variable name. With a good variable name var actually improves your code if you were to change the type later. Consider: int customerBalance = GetCustomerBalance();, which has to be changed to decimal customerBalance = GetCustomerBalance(); after the function return is changed, where var customerBalance = GetCustomerBalance(); would have worked both ways. If you have enough dicipline in variable names one wouldn't need to look at the types (mostly), and var promotes this (to a degree).

        ____________________________________________________________ Be brave little warrior, be VERY brave

        1 Reply Last reply
        0
        • J jpg 0

          Consider this code:

          var num = MyMath.Add( 123, 789 );

          By just reading the code, you won't be able to know whether num is an int32, int16, float, double, or any other types. :^)

          H Offline
          H Offline
          Henk Nicolai
          wrote on last edited by
          #19

          Agreed... So why don't we have some kind of Visual Studio option that does all the type-inference and replaces all those 'var's with actual inferred types? I thought the main purpose of 'var' was to increase productivity... Or, maybe the following syntax should be allowed: Dictionary<string> myDictionary = new(StringComparer.OrdinalIgnoreCase); (E.g. no extra type declaration if selecting a constructor from the same class. Not very readable though if you're not used to it.) - DerHenker

          A 1 Reply Last reply
          0
          • J jpg 0

            Consider this code:

            var num = MyMath.Add( 123, 789 );

            By just reading the code, you won't be able to know whether num is an int32, int16, float, double, or any other types. :^)

            A Offline
            A Offline
            Alexander DiMauro
            wrote on last edited by
            #20

            .jpg wrote:

            var num = MyMath.Add( 123, 789 );

            Once again, your example is a perfect example of PEBKAC, and not an example of a problem with var. If used as intended, 'var' is extremely useful. Your example is NOT an intended use. While it can be done, you are absolutely correct. You don't know what the return value will be. But, when used with LINQ, it is EXTREMELY useful, and that was really its intended purpose. It can also help in situations like this: SomeInsanelyLongNameThatNeverEnds<LongLongName, SuperLongNameAgain> someVar = new...you get the picture. Throw a var in there and it shortens it considerably without losing any information. That is really, IMHO, the only time to use var outside of LINQ, when you don't lose any information. The final point is...get ReSharper. If you are unsure of return values, but want to display them, type in 'var', and then select 'specify type explicitly' in ReSharper, and it puts the return type in there for you. VERY useful! I use that one all the time.

            1 Reply Last reply
            0
            • M Marc Clifton

              Except that in the second example, after hitting spacebar after the "new", the editor fills in the rest, so either way, you have to type in the type. Uh. No pun intended. I still don't see the purpose of var except for Linq and/or lambda expressions. Marc

              F Offline
              F Offline
              Filip Duyck
              wrote on last edited by
              #21

              Code is written once and read many times. Why force the reader to read the same information twice? On top of that, using 'var' somewhat forces people to pick more meaningful names, and it makes refactoring easier. Of course, that is only my opinion. You're entitled to yours, and I'm sure many people would agree with you.

              1 Reply Last reply
              0
              • C CPallini

                Well, I actually would keep the "var" and drop the "C#"... :rolleyes:

                If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
                This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
                [My articles]

                modified on Friday, July 2, 2010 11:52 AM

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

                Let's name it DIM!

                I are Troll :suss:

                1 Reply Last reply
                0
                • J jpg 0

                  Consider this code:

                  var num = MyMath.Add( 123, 789 );

                  By just reading the code, you won't be able to know whether num is an int32, int16, float, double, or any other types. :^)

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

                  I think its a really bad idea too. It opens the doors to all kind of bad/lazy code. Poor testers, reafactores, inheritors... It's even worse with the introduction of dynamic keyword, which flushes type safety down the toiled. I see .net going downhill. :~

                  1 Reply Last reply
                  0
                  • M Marc Clifton

                    Except that in the second example, after hitting spacebar after the "new", the editor fills in the rest, so either way, you have to type in the type. Uh. No pun intended. I still don't see the purpose of var except for Linq and/or lambda expressions. Marc

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

                    Marc Clifton wrote:

                    I still don't see the purpose of var except for Linq and/or lambda expressions.

                    Then don't use it. -Max

                    M 1 Reply Last reply
                    0
                    • L Lost User

                      Marc Clifton wrote:

                      I still don't see the purpose of var except for Linq and/or lambda expressions.

                      Then don't use it. -Max

                      M Offline
                      M Offline
                      Marc Clifton
                      wrote on last edited by
                      #25

                      Max Peck wrote:

                      Then don't use it.

                      I don't. :) But somewhere in this morass of opinions, there ought to be some actual way of determining best practices, and that's what I keep trying to figure out. Marc

                      L 1 Reply Last reply
                      0
                      • T Todd Smith

                        .jpg wrote:

                        Consider this code: var num = MyMath.Add( 123, 789 ); By just reading the code, you won't be able to know whether num is an int32, int16, float, double, or any other types.

                        If type matters then don't use var. How hard can that be?

                        Todd Smith

                        E Offline
                        E Offline
                        Ed K
                        wrote on last edited by
                        #26

                        Because there are still those using Re-factor who right click and change all to 'var' as a first step to obfuscating their code.

                        ed ~"Watch your thoughts; they become your words. Watch your words they become your actions. Watch your actions; they become your habits. Watch your habits; they become your character. Watch your character; it becomes your destiny." -Frank Outlaw.

                        T 1 Reply Last reply
                        0
                        • M Marc Clifton

                          Max Peck wrote:

                          Then don't use it.

                          I don't. :) But somewhere in this morass of opinions, there ought to be some actual way of determining best practices, and that's what I keep trying to figure out. Marc

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

                          Marc, Best practices? From this group? Are you nuts? :laugh: You'll definitely get some good input from the guys here but "best practices" is something I've never even see an organized company maintain without great difficulty let alone a forum of rogue programmers like us! Don't tell me you don't still use GOTO. ;-) -Max

                          1 Reply Last reply
                          0
                          • J jpg 0

                            Consider this code:

                            var num = MyMath.Add( 123, 789 );

                            By just reading the code, you won't be able to know whether num is an int32, int16, float, double, or any other types. :^)

                            M Offline
                            M Offline
                            martinluch
                            wrote on last edited by
                            #28

                            Some times you dont want to create a class to expose only a couple of properties. What do you think about this code...

                            // Build an anonymous type
                            var anon1 = new { number = 4, square = 4 * 4 };
                            // Do something with it
                            Console.WriteLine(string.Format("Square of {0} is {1}", anon1.number, anon1.square));

                            or...

                            List<object> myList = new List<object>(); // Build a new collection
                            for (int i = 0; i < 5; i++)
                            {
                            var anon = new { number = i , square = i * i }; // Build an anonymous type
                            myList.Add(anon); // Start adding anonymous types to it
                            }

                            foreach (var anonymousType in myList)
                            {
                            PropertyInfo[] MyProperties = anonymousType.GetType().GetProperties(); // Reflect the type

                                foreach (var Property in MyProperties) 
                                {
                                	Console.WriteLine(Property.GetValue(anonymousType, null).ToString()); // Do what you want with the property
                                }
                            

                            }

                            Useful or not? Up to you...

                            1 Reply Last reply
                            0
                            • M Marc Clifton

                              Except that in the second example, after hitting spacebar after the "new", the editor fills in the rest, so either way, you have to type in the type. Uh. No pun intended. I still don't see the purpose of var except for Linq and/or lambda expressions. Marc

                              J Offline
                              J Offline
                              John Oxley
                              wrote on last edited by
                              #29

                              But you still have to type in the type the first time round. Plus the line is longer and more cumbersome to read.

                              M 1 Reply Last reply
                              0
                              • J John Oxley

                                But you still have to type in the type the first time round. Plus the line is longer and more cumbersome to read.

                                M Offline
                                M Offline
                                Marc Clifton
                                wrote on last edited by
                                #30

                                John Oxley wrote:

                                Plus the line is longer and more cumbersome to read.

                                I must read code differently from other people. I've never noticed that the "old" style is cumbersome! Marc

                                1 Reply Last reply
                                0
                                • D dazfuller

                                  Agreed, in a typed language what's the point of not defining the type? If you don't want to define the type then use Python

                                  J Offline
                                  J Offline
                                  John Oxley
                                  wrote on last edited by
                                  #31

                                  var does compile time inference of the type. It looks at the right hand side of the equals and says, ah that's a string therefore that's what I shall be. Not an int. Not a double. Not even shall I pretend to be a DateTime. The day that someone tries to made me a TcpClient, I shall have my trusty compiler beat thee with a stick.

                                  var transaction = repository.GetTransaction(id);

                                  I'm guessing that transaction is going to be of the type AKittyLitter. Yes that makes sense. Oh and id is the name of my CEO's pet gerbil. (If you use Notepad / vim / anything else stupid, I'm not talking to you) You're working in Visual Studio, not nano. Use it.

                                  var x = y.Foo();

                                  The bloke who actually has that in his release project should be shot. I agree with a previous poster that your variable names and method names should mean something. If repository.GetTransaction doesn't return a Transaction object, then I've designed my code stupidly. If Transaction doesn't have a decimal Amount property on it, well, then Visual Studio will tell you before the 3rd letter. Go read this: http://omergertel.com/2010/07/04/how-to-read-code/[^]

                                  D 1 Reply Last reply
                                  0
                                  • J John Oxley

                                    var does compile time inference of the type. It looks at the right hand side of the equals and says, ah that's a string therefore that's what I shall be. Not an int. Not a double. Not even shall I pretend to be a DateTime. The day that someone tries to made me a TcpClient, I shall have my trusty compiler beat thee with a stick.

                                    var transaction = repository.GetTransaction(id);

                                    I'm guessing that transaction is going to be of the type AKittyLitter. Yes that makes sense. Oh and id is the name of my CEO's pet gerbil. (If you use Notepad / vim / anything else stupid, I'm not talking to you) You're working in Visual Studio, not nano. Use it.

                                    var x = y.Foo();

                                    The bloke who actually has that in his release project should be shot. I agree with a previous poster that your variable names and method names should mean something. If repository.GetTransaction doesn't return a Transaction object, then I've designed my code stupidly. If Transaction doesn't have a decimal Amount property on it, well, then Visual Studio will tell you before the 3rd letter. Go read this: http://omergertel.com/2010/07/04/how-to-read-code/[^]

                                    D Offline
                                    D Offline
                                    dazfuller
                                    wrote on last edited by
                                    #32

                                    What's more useful though is if a maintainer can do read-the-code time inference of the type. If y.Foo() returned a NappySack object then they can go have a look at that type and figure out what it can do. With a var they'd have to go and look at the y.Foo() to figure out what is returned and then figure it out from there. And I don't want my compiler having to figure this out, it takes it long enough as it is already to do anything useful and I can only spend so much of my day making cups of coffee!

                                    1 Reply Last reply
                                    0
                                    • H Henk Nicolai

                                      Agreed... So why don't we have some kind of Visual Studio option that does all the type-inference and replaces all those 'var's with actual inferred types? I thought the main purpose of 'var' was to increase productivity... Or, maybe the following syntax should be allowed: Dictionary<string> myDictionary = new(StringComparer.OrdinalIgnoreCase); (E.g. no extra type declaration if selecting a constructor from the same class. Not very readable though if you're not used to it.) - DerHenker

                                      A Offline
                                      A Offline
                                      AspDotNetDev
                                      wrote on last edited by
                                      #33

                                      Pft, why even specify a type? Check out what this person has to say.

                                      [Forum Guidelines]

                                      1 Reply Last reply
                                      0
                                      • E Ed K

                                        Because there are still those using Re-factor who right click and change all to 'var' as a first step to obfuscating their code.

                                        ed ~"Watch your thoughts; they become your words. Watch your words they become your actions. Watch your actions; they become your habits. Watch your habits; they become your character. Watch your character; it becomes your destiny." -Frank Outlaw.

                                        T Offline
                                        T Offline
                                        Todd Smith
                                        wrote on last edited by
                                        #34

                                        Ed K wrote:

                                        Because there are still those using Re-factor who right click and change all to 'var' as a first step to obfuscating their code.

                                        I guess that's their problem then isn't it :)

                                        Todd Smith

                                        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