I still think the "var" in C# is a really bad idea
-
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
Marc Clifton wrote:
xcept 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.
Notepad has never done this for me. ;P
"WPF has many lovers. It's a veritable porn star!" - Josh Smith
As Braveheart once said, "You can take our freedom but you'll never take our Hobnobs!" - Martin Hughes.
-
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
Marc Clifton wrote:
var except for Linq and/or lambda expressions
Oh, so you can use it for other things as well :-O it never even occurred to me.
Never underestimate the power of human stupidity RAH
-
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. :^)
.jpg wrote:
you won't be able to know whether num is an int32, int16, float, double, or any other types
Much of the time, knowing the exact type doesn't matter (in the example you gave, you know it's probably a number). And you could find out by mousing over "Add", or by typing "num" (the tooltip will tell you the type). Of course, typing "int" isn't going to cause you much more trouble than typing "var", so it's probably more appropriate here to just type "int". Still, I wouldn't say what you have shown demonstrates why var in C# is "a really bad idea". In fact, it seems like a pretty good idea in many situations (covered by other posters above already).
-
.jpg wrote:
By just reading the code, you won't be able to know whether num is an int32, int16, float, double, or any other types.
But the compiler will, and at the end of the day, that's what is important.
J4amieC wrote:
But the compiler will, and at the end of the day, that's what is important.
Is it? I think not, sir! What is most important in the long run is that the code is maintainable, as the costs of maintenance outweigh the costs of development (usually). That said, var is useful when used appropriately.
___________________________________________ .\\axxx (That's an 'M')
-
.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
exactly my thought!
A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station.... _________________________________________________________ My programs never have bugs, they just develop random features.
-
Well how about this:
static void Main(string[] args)
{
SomeFunction(SomeClass.SomeOtherFunction(arg[0]));
}static void SomeFunction(int i)
{
throw new Exception();
}static void SomeFunction(double d)
{
Console.WriteLine(d);
}Don't look at the terrible coding style too much. This is just plain C#1 right? But do you know, without looking up SomeClass.SomeOtherFunction, what will happen? I sure don't.
Good one! :laugh:
A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station.... _________________________________________________________ My programs never have bugs, they just develop random features.
-
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. :^)
-
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. :^)
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!
-
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. :^)
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 todecimal customerBalance = GetCustomerBalance();
after the function return is changed, wherevar 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), andvar
promotes this (to a degree).____________________________________________________________ Be brave little warrior, be VERY brave
-
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. :^)
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 -
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. :^)
.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.
-
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
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.
-
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
-
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. :^)
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. :~
-
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
-
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
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
-
.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
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.
-
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
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
-
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. :^)
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 typeforeach (var Property in MyProperties) { Console.WriteLine(Property.GetValue(anonymousType, null).ToString()); // Do what you want with the property }
}
Useful or not? Up to you...
-
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
But you still have to type in the type the first time round. Plus the line is longer and more cumbersome to read.