VB .NET Language Features
- Keyword Changes
- Functional Changes
- Upgrading from VB 6.0
- Summary
As is obvious by now, VB .NET and VS .NET contain significant changes from previous versions of VB in terms of the runtime architecture and the features of the development environment itself. In addition, the VB .NET language has been changed in accordance with the design goals to modernize and simplify the language, reduce programming errors, and provide full access to the Common Language Runtime (CLR) and Services Framework. Although some of these changes have produced much discussion in the VB community, my personal view is that this is good because it tightens the language and therefore makes it a better tool for development.
As a result of these changes, the language has actually been simplified in several respects by removing duplicate or confusing constructs, removing functionality now supported by the Services Framework, and taking away some of the idiosyncratic behavior particular to BASIC. In this chapter, we'll walk through the details of these changes as they related to both the structure of the language and the functional changes that might require you to think differently when coding in VB .NET. In addition, we'll explore the compatibility features that assist in transitioning code from VB 6.0 to VB .NET including using the Upgrade Wizard. However, it should be noted that some of the modernizing features that require more in-depth treatment, such as changes to classes, inheritance, explicit interface declaration, structured exception handling, and free threading, will be handled in Chapter 4, "Object-Oriented Features," Chapter 6, "Error Handling and Debugging," and Chapter 12, "Accessing System Services."
Keyword Changes
Unlike previous versions of VB, VB .NET runs within the context of the CLR and, as a result, must adhere to the rules of any Common Language Specification (CLS) compliant language. It shouldn't be surprising to learn that, as a result, the language itself is contained in an assembly with the namespace Microsoft.VisualBasic. When you choose to create a project in VS .NET with VB .NET, this assembly automatically is referenced, and its classes and methods can be referred to without using dot notation because they are declared with a special attribute making them global. This means that you don't have to be concerned with the class structure of the Microsoft.VisualBasic namespace, although the online documentation breaks it down for you. For the purposes of this chapter, we'll treat all the members of the classes contained in the Microsoft.VisualBasic namespace as peers and intrinsic keywords.
To begin, consider Table 3.1, which shows the keywords removed from VB .NET available in previous versions. Contrast this table with the keywords added to the language in Table 3.2.
Table 3.1 Obsolete Keywords, Functions, and Statements in VB .NET
Keyword, Function or Statement |
Disposition |
Array |
Function formerly used to populate an array with arguments. Now the { } can be used in the declaration of the array. |
As Any |
Formerly used with the Declare statement. Now VB .NET supports overloading declares so that explicit data types must be used. |
Atn, Sgn, Sqr |
Replaced by the System.Math namespace. |
Calendar |
Replaced by the System.Globalization namespace. |
Circle, Line |
Replaced by the System.Drawing namespace. |
Currency |
Replaced by the Decimal data type. |
Date |
Still supported as a data type (mapping to System.DateTime) but is no longer a function returning a 4-byte date value. Use the Today property of the System.DateTime structure to return the day in the 8-byte CLR format. |
Debug.Assert, Debug.Print |
Replaced by methods in the System.Diagnostics namespace. |
DefBool, DefInt, DefStr, and so on |
Formerly used to specify data types for implicit declarations. No longer supported. |
DoEvents |
Replaced by a method in the System.WinForms.Application class. |
Empty, Null, IsEmpty, IsNull |
Formerly used for uninitialized variables and those that don't contain data. Now both conditions are handled by Nothing. Statements to check for these conditions also have been removed. Database nulls can be tested for using the IsDBNull function or against the System.DBNull.Value property. |
Eqv, Imp |
Bitwise operators replaced by the equals (=) operator and using Not and Or in conjunction (A Imp B) = ((Not A) Or B). |
GoSub |
Formerly used to branch to a line label and return later. No longer supported. |
On..GoSub, On..Goto |
Formerly used to conditionally branch to a line label. Should use Select Case or Switch instead. |
IsMissing |
Formerly used to determine whether a value was supplied for an Optional parameter. Now all optional parameters must have default values. |
IsObject |
Formerly used to determine whether a variable referenced an object. Replaced with IsReference. |
Let, Set |
Formerly, Set was used to indicate that an object reference was being assigned (Let was the default). Because default properties no longer are supported unless they accept parameters, these statements have been removed. |
LSet, RSet |
Replaced by PadRight and PadLeft methods of the System.String class, although still supported. However, LSet was also formerly used to copy user-defined types (UDTs). This use is no longer supported. |
PSet, Scale |
Formerly used to manipulate the color of a point and the coordinate system on forms and controls. No longer supported. Equivalent functionality exists in System.Drawing. |
MsgBox |
Still supported, but recommended use is the System.WinForms.MessageBox class. |
Option Base |
Formerly used to define the lower bound of arrays. Now all arrays are zero bound, so it is no longer supported. |
Option Private Module |
Formerly used to declare an entire module as private to the project. Now each module can be marked as private using the Private keyword. |
Randomize, Rnd, Round |
Replaced by the System.Random class and the Round method of the System.Math class. Rnd and Randomize still exist in the Microsoft.VisualBasic namespace, however. |
String |
Replaced by the overloaded constructor of the String class used for initialization. |
String Functions |
VB functions that returned strings by appending the $ have now been replaced by overloaded methods. Their counterparts that return Variants have been replaced with overloads that return Object. |
Time |
Replaced by the TimeOfDay property of the System.DateTime structure. Note that the Date data type is no longer represented as Double but rather as a DateTime structure. |
Type |
Replaced by the Structure statement. |
VarType |
Formerly used to determine the type of a Variant. Although it still exists, it should be replaced by the GetTypeCode method of the specific data types. |
Variant |
Formerly used to hold any type of data. Replaced with System.Object as the universal data type. |
Wend |
Formerly used in While...Wend loops. Now replaced with While...End While. |
Table 3.2 New Keywords, Functions, and Statements in VB .NET
Class |
Disposition |
IsArray |
Function used to determine whether an object is an array. |
Choose |
Function used to select and return a value from a list of arguments based on an index. |
Short, CShort |
New data type representing a 16-bit integer equivalent to Integer in VB 6.0. CShort converts from another data type to Short. |
IsDBNull |
Function that determines whether an expression evaluates to System.DBNull. Not the same as Nothing or a null string (""). |
TimeOfDay |
Statement that sets or returns the current system time. |
GetException |
Function that returns the Exception object used in the Err object. Provides a mapping from the Err object to exceptions. |
Try...Catch...Finally, Throw |
Statements used to perform structured exception handling. |
GetType, CType, Convert |
Function used to return the Type of the argument and System classes to convert to a different type. |
Option Strict On|Off |
Statement used to ensure type-safe code at compile time when turned on. Default in VS .NET is On. |
^=, *=, /=, \=, +=, -=, &= |
Operators used to perform the operation in the first part of the expression and assign the result to the variable. |
AndAlso, OrElse |
Logical operators used for short-circuit comparisons. |
Delegate |
Statement used to declare a delegate (covered in Chapter 4). |
Imports |
Statement that imports namespace names from referenced assemblies. |
AddHandler, RemoveHandler |
Dynamically adds and removes event handlers. |
Inherits, Overloads, Overrides, NotInheritable, MustInherit, NotOverridable, Overridable |
Keywords used with classes, as discussed in Chapter 4. |
Interface |
Statement used to define an interface, as discussed in Chapter 4. |
Protected, Shadows, Shared, ReadOnly, WriteOnly |
Access attributes for a class, method, or property, as discussed in Chapter 4. |
MyBase |
Object used to access the base class from within a class, as discussed in Chapter 4. |
MyClass |
Object used to access the current class. |
Namespace |
Used to define a boundary for classes. |
Structure |
Statement that replaces UDTs. |
SyncLock..End SyncLock |
Statements that ensure that a block of code is not executed concurrently by multiple threads. Discussed in Chapter 12. |
IsReference |
Function that determines whether the given variable is a valid reference to an object. |
DirectCast |
Function used to more strictly convert to a different type |
You'll notice that in most instances for keywords removed from the language, an equivalent functionality exists in the Services Framework. In addition, many of the new keywords are related to the object-oriented features of VB .NET provided by the CLR. However, taken as a whole, you can see that the language has not become more complex through the addition of scores of keywords.