Is VB really case insensitive?
I'm not trying to start an argument here, but for whatever reason, it's typically stated that Visual Basic is case insensitive and C languages aren't (and somehow that is a good thing).
But here's my question: Where exactly is Visual Basic case insensitive? When I type...
Dim ss As String
Dim SS As String
...into the Visual Studio 2008 or Visual Studio 2010 IDE, the second one has a warning of "Local variable SS
is already declared in the current block". In the VBA VBE, it doesn't immediately kick an error, but rather just auto-corrects the case.
Am I missing something here with this argument that Visual Basic is not case sensitive? (Also, if you know or care to answer, why would that be a bad thing?)
Why am I even asking this question?
I've used Visual Basic in many of its dialects for years now, sometimes as a hobbyist, sometimes for small business-related programs in a workgroup. As of the last six months, I've been working on a big project, much bigger than I anticipated. Much of the sample source code out there is in C#. I don't have any burning desire to learn C#, but if there are things I'm missing out on that C# offers that Visual Basic doesn't (an opposite would be VB.NET offers XML Literals), then I'd like to know more about that feature. So in this case, it's often argued that C languages are case sensitive and that's good and Visual Basic is case insensitive and that is bad. I'd like to know...
- How exactly is Visual Basic case insensitive since every single example in the code editor becomes case sensitive (meaning the case gets corrected) whether I want it or not.
- Is this compelling enough for me to consider moving to C# if VB.NET case is somehow limiting what I could do with code?
The difference between VBA and VB.NET is just because VB.NET compiles continuously in the background. You'll get an error when you compile the VBA.
Like Jonathan says, when programming you can think of VB.NET as case-insensitive apart from string-comparisons, XML, and a few other situations...
I think you're interested in what's under the hood. Well, the .NET Common Language Runtime is case-sensitive, and VB.NET code relies on the runtime, so you can see it must be case-sensitive at runtime, e.g. when it's looking up variables and methods.
The VB.NET compiler and editor let you ignore that - because they correct the case in your code.
If you play around with dynamic features or late-binding (Option Strict Off) you can prove that the underlying run-time is case-sensitive. Another way to see that is to realise that case-sensitive languages like C# use the same runtime, so the runtime obviously supports case-sensitivity.
EDIT If you want to take the IDE out of the equation, you can always compile from the command-line. Edit your code in Notepad so it has ss
and SS
and see what the compiler does.
EDIT Quote from Jeffrey Richter in the .NET Framework Design Guidelines page 45.
To be clear, the CLR is actually case-sensitive. Some programming languages, like Visual Basic, are case insensitive. When the Visual Basic compiler is trying to resolve a method call to a type defined in a case-sensitive language like C#, the compiler (not the CLR) figures out the actual case of the method's name and embeds it in metadata. The CLR knows nothing about this. Now if you are using reflection to bind to a method, the reflection APIs do offer the ability to do case-insensitive lookups. This is the extent to which the CLR offers case-insensitivity.
Part of the problem here is you need to divide the language from the IDE experience.
As a language, VB.NET is certainly a case insensitive with respect to identifiers. Calling DateTime.Parse
and datetime.parse
will bind to the exact same code. And unlike languages like C#, it is not possible to define methods or types which differ only by case.
As an IDE, VB.NET attempts to preserve the case of existing identifiers when it pretty lists a block of code. Pretty lists occur whenever you move off of the current logical line of code. In this case you move off of the second declaration of SS
, the pretty lister notices there is an existing identifier with that name and corrects it to have matching case.
This behavior, though, is purely done as a user value add. It is not a part of the core language.