C# 3.0 added LINQ, which is a great feature for working with data. Okay, so maybe Entity Framework is going to make it obsolete (depending on who you ask), but it still served a great purpose for a little while. However, to facilitate LINQ, Microsoft also introduced the bane of good programming –
Var is a way to implicitly create variables of a type. The compiler figures out what the type is based on what you first assign to it. So in this case:
var a = "Hello, World!";
a” will be of type
String. And in this case:
var b = new SqlCommand();
b” will be of type
SqlCommand. What’s wrong with this, you ask? Isn’t it great because it leads to less typing? Yes, it is less typing, but that doesn’t make it a good thing. Take a look at this little example:
var value1 = "Hello";
var value2 = value1;
What type is
string. Pretty simple, right? Yes, as long as
value2 is in close proximity to
value1. Just imagine that
value1 is defined at the very top of a very complex algorithm, and
value2 is not defined until the very bottom, potentially several screens of code away. An extreme case, yes, but it does happen. Visual Studio can tell you what the type is if you hover over it, sure, but what happens when someone is trying to do a code review, not in Visual Studio? That person now has to go scanning through the prior code to figure out what the type of that variable is. Is it really that difficult to type "
string value2" instead of "
var value2"? No, it is not.
Var is a crutch. It is there for lazy developers. And it is really annoying because it seems like every person that blogs about C# uses it almost exclusively now in all of their code examples. Just look at any post on Scott Hanselman’s blog to see what I mean. Just because you can do something with your favorite programming language, it doesn’t mean you should. I can use “
goto” in C# too, but you’re never going to catch me doing it.
Var is the same sort of thing – a feature that has very limited required usage, so let’s keep it that way and only use it when required, not all over the place.