Visual Basic .NET
I, for one, have been longing for Visual Basic .NET for a long time. Why, you ask?
Problems Solved with Visual Basic .NET
VB has always had great ideas for how applications should be built, but the implementations have had quirks. The following are a few examples of problems that were found in VB6 but that are now solved in Visual Basic .NET:
WithEvents can't be used with user-defined interfacesThe first time I tried to use WithEvents with user-defined interfaces, it took me half a day to decide that it just wasn't possible. A call-back solution solves the problem, but it's still irritating that the system-plugged solution doesn't work.
Single-threaded apartments (STA) are not always a sufficient model for multithreadingVB6 protects us from ourselves. Most of the time, this is a good thing. On the other hand, when we have advanced needs and know what we are doing, it would be nice to have the capability to move into dangerous grounds. Using free threading is a typical example. This is definitely interesting for COM+ components. The built-in synchronization support in COM+ helps a lot with writing thread-safe code without STAs.
When GlobalMultiUse is used, the class must live in another DLLI have also had problems with GlobalMultiUse in COM+ applications. Therefore, I instead use old-style code modules for my helper routines in VB6. That means I often employ code reuse instead of binary reuse, but I also skip some instantiation overhead (both when I write the code and when the code is executed).
The class editor isn't made for writing user-defined interfaces, and VB creates an ugly type libraryBecause of this, although it is possible to take some control of the interfaces with VB6, serious VB6 developers often write the interfaces in IDL and compile them with Microsoft Interface Definition Language (MIDL, the compiler that transforms IDL into, for example, a typelib). There is not a lot of "VB feeling" in that approach, but it is the preferred way.
There is a lack of strong typingIf I forget to declare the data type for a variable or parameter, I consider this a bug, and I definitely want the compiler to tell me about it. VB6 forgives and offers a Variant instead. Another example is that VB6 forgives when I forget to do an explicit cast. It makes an implicit one automatically. Is it good to be forgiving? No, not in this case. Hiding risks and bugs is not a good thing.
There is a weak error-handling schemeThe error handling in VB6 is quite weak and definitely not well understood. Unfortunately, it's not uncommon to find insufficient or incorrect error-handling code in articles published by Microsoft, either.
The implicit cleanup is shakyEspecially in a highly stressed server-side scenario, there have been several reports that the implicit cleanup of VB6 isn't cleaning up correctly. There is also the more well-known circular reference problem of COM that you have to break up manually. (To understand the circular reference problem, assume that you have two objects, each of which keeps a reference to the other object. It's not enough to set one of those objects to Nothing explicitly. The reference countingbased cleanup algorithm in COM will keep both objects alive.)
-
There is a lack of shared (or class or static) membersI tried to implement an ordinary Singleton4 (which means one single object, reused over and over again, similar to a global object) without any luck when VB4 was released, because VB4 didn't have members that belong to the class rather than the objects. The same goes for VB5 and VB6.
In addition to these problems, there has also been a lack of other object-oriented concepts too. The most common complaint in that area is probably the lack of implementation inheritance. (Implementation inheritance means that a class can inherit the implementation from another class. When a programmer refers to "inheritance," he or she is probably referring to this type of inheritance.) At first, I thought Microsoft was "creating" a truth when they said that large projects would suffer if you used implementation inheritance. (Over the years, I have developed an ability to see conspiracies everywhere.) A few years later, I read Clemens Szyperski's Component Software. Beyond Object-Oriented Programming5 and I understood that it was a well-known fact in academic research. Since then, I've been happy using user-defined interfaces and separating the interface from the implementation. I will use user-defined interfaces a lot in .NET too, but there are situations for implementation inheritance. Inheritance is good if you want to inherit the implementation from the base class, but that is actually the only case. We also only have single inheritance in .NET and, therefore, you have to be careful to not "waste" the single inheritance possibility.
As I mentioned earlier, these problems have all been solved with Visual Basic .NET. Visual Basic .NET = the VB way, with fewer quirks.
New "Problems" with Visual Basic .NET
Unfortunately, even though Visual Basic .NET solves a lot of problems, it introduces some as well. For one, Visual Basic .NET is a much harder language to learn for newcomers than VB6. It is more competent, but also full of advanced concepts. Formal training and/or much experience are a must. In fact, for this reason and others, some developers don't like Visual Basic .NET at all. In my opinion, it's a huge and great leap forward. One thing that does irritate me is that between beta 1 and 2, Microsoft suddenly announced that they were changing Visual Basic .NET so that is was more consistent with VB6. They based this decision on the feedback (or, rather, criticism) they got from the VB MVPs. When I discussed this with Microsoft, I was told that these changes would only increase backward compatibility, and that this wouldn't affect the future at all. I don't agree. We will have to live with those mistakes a long time.
The following are the changes Microsoft made between beta 1 and beta 2 of Visual Basic .NET:
-
True should be represented as -1 in numerical form, not as 1If you have coded so that you are dependent on this, you should be prepared to make changes in the future.
-
And and Or will not be short-circuitingThe main risk was said to be if a user had written an If clause as follows:
If a = 1 And InitializeSome() Then
Assume that InitializeSome() sets some global variables. If And would be short-circuiting and a = 1 is False, InitializeSome() would not execute in Visual Basic .NET. In my opinion, this type of coding is a hack, and the programmer should be prepared for ugly code like this to break in the future. It won't happen in Visual Basic .NET.
If you want a short-circuiting And/Or, you should use AndAlso/OrElse instead. I always want it to short circuit, so I have to get used to using those new syntactic elements.
And/Or will be bitwise operations again, as in VB6(Before this change, they were purely logical operators and BitAnd/BitOr had to be used for bitwise operations.)
Array-declarations should set the upper bound, not the number of elementsIf you declare an array as follows:
Dim x(5) As Integer
you get an array of six elements, not five. Over the years, this has irritated me repeatedly. It's not intuitive, and I can't see the point in doing it like this.
Despite these changes, the MVPs are still unhappy with Visual Basic .NET. The only thing Microsoft achieved was to make the language weaker and to irritate a large and quiet part of the VB community.
I decided on Visual Basic .NET as my .NET language of choice quite early. After that, when Microsoft did their movement back, I almost decided to use C# instead. It's actually not a dramatic decision. You can be switching between Visual Basic .NET and C#, and still be quite productive. I will probably work mostly in Visual Basic .NET, despite some irritating details, because of my background. I'm sure that I'll use C# quite a lot as well.