Practical Standards for Microsoft Visual Basic .NET (Pro-Developer)
[Previous] [Next]
Developers moved away from data type suffixes toward the use of single-character prefixes (for example, Dim lWidth As Long and Dim iHeight As Integer) . Prefixes make more sense because they are generally more intuitive than symbols and more of them are available. The single-digit prefix became popular but was doomed from the beginning. There are only 26 unique characters (a-z) available for single-character prefixes (still more than the number of available symbols), but there are many different types of variables and objects, and many of them share the same first letter.
A better naming convention eventually replaced the single-character prefix. This conventionusing a three-character prefix to denote data types and control typesis known as Hungarian notation, partly because its creator, Charles Simonyi, was originally from Hungary, and partly because these prefixes tend to make variable names look like a foreign language. Prefixes can grow in length as additional information is denoted, such as scope or the fact that a variable is an array. Although the standard prefixes are usually three characters, with the possible addition of modifiers, conventions using larger prefixes are also referred to as Hungarian notationHungarian notation is a concept, not a specific implementation.
In Hungarian notation, a unique three-character prefix is assigned to each data type and to each type of control. The three characters allow for plenty of versatility and for prefixes that are logical and intuitive. Look at the following Dim statements and you'll see how the prefixes align fairly intuitively with the variables' assigned data types:
Dim strName As String Dim intAge As Integer Dim lngMiles As Long Dim curSalary As Currency |
Now consider once again the code statement shown earlier:
TotalDue = LineItemTotal _ Discount + TotalTax |
Each of the following statements is a possible equivalent of the previous statement. Three-character prefixes have been added. Also, for clarity, control references show their default properties.
txtTotalDue.Text = curLineItemTotal _ txtDiscount.Text + curTotalTax curTotalDue = curLineItemTotal _ curDiscount + curTotalTax txtTotalDue.Text = txtLineItemTotal.Text _ txtDiscount.Text + _ txtTotalTax.Text |
As you can see, prefixes make the statements much more understandable. Simply reading the statement tells you everything that is happening; you don't have to look at variable declarations to determine what's going on.
NOTE
There may well be no topic that causes more polarization among programmers than the use of Hungarian notation to denote type and scope. I firmly and unequivocally believe in the use of Hungarian notation and have personally enjoyed the benefits it provides.
Denoting a Variable's Data Type
The following table lists the prefixes you can use to denote a variable's data type.
Prefixes for Variable Data Types
Data Type | Prefix | Example |
---|---|---|
Boolean | bln | blnLoggedIn |
Currency | cur | curSalary |
Control | ctl | ctlLastControl |
Double | dbl | dblMiles |
ErrObject | err | errLastError |
Single | sng | sngYears |
Handle | hwnd | hwndPicture |
Long | lng | lngOnHand |
Object | obj | objUserTable |
Integer | int | intAge |
String | str | strName |
User -defined type | udt | udtEmployee |
Variant (including Dates) | vnt | vntDateHired |
Array | a | astrEmployees |
The obj prefix should be reserved for use when a specific prefix isn't suited. The most common use of this prefix is when referencing the Automation libraries of other applications. For instance, when automating Microsoft Word, you create an instance of Word's Application object. Since no prefix has been designated specifically for Word objects, obj works just fine, as shown in the following statement:
Dim objWord As Word.Application |
User-defined data types (UDTs) are custom data structures. Your ability to create objects has rendered UDTs unnecessary in many cases, but you'll probably still have occasion to use a UDT. User-defined data types are composed of multiple variables, often of different types. When defined, the UDT should be prefixed with type_ . However, each of the variables that make up the UDT should include the prefix of its typeor no prefix at all. Although it's generally a good idea to give the variables a prefix, some developers feel that doing so detracts from the object-oriented feel of using a UDT. If you use the Microsoft Windows API (application programming interface)and you really shouldyou'll note that the Windows API types don't use prefixes on the member variables. As with all aspects of applying standards, whichever method you choose, apply it consistently. The following code shows two possible ways to create a custom user-defined data type:
Private Type type_Printer DriverName As String DeviceName As String Port As String Copies As Integer Orientation As Long End Type Private Type type_Printer strDriverName As String strDeviceName As String strPort As String intCopies As Integer lngOrientation As Long End Type |
When creating a variable to hold a user-defined data type, use the udt prefix. Unfortunately, udt doesn't tell you anything about the specific UDT that it holds, but since the possibilities are endless and vary from program to program, it's impossible to assign them specific prefixes. The following statement is a sample declaration of the type created previously:
Dim udtPrinter As type_Printer |
Prefixing a variable as an array is different from prefixing other types of variables. You use a to denote that the variable is an array, but you then follow a with the prefix for the array's data typefor example:
Dim asngGrades(9) As Single |
Denoting a Variable's Scope
In addition to prefixing a variable to denote its data type, you can and should use a prefix to denote its scope. This scope designation character precedes the data type prefix and is separated from it by an underscore . For example, to denote a module-level string variable, you can use a statement such as:
Dim m_strName As String |
Prefixes for Variable Scope
Prefix | Description | Example |
---|---|---|
g | Global | g_strSavePath |
m | Local to module or form | m_blnDataChanged |
st | Static | st_blnInHere |
(no prefix) | Nonstatic, local to procedure | intIndex |
Other Prefixes
Prefixes aren't just for variables. All standard objects (including forms and controls) have a three-character prefix, as shown in the chapter's remaining tables. Learn and use these prefixes consistentlyif you're not already. Correctly applying the standard three-character prefixes to all of your variables and objects makes your code more self-documenting and easier to maintain.
Prefixes for Standard Controls
Control | Prefix | Example |
---|---|---|
Check | chk | chkPrint |
Combo | cbo | cboTitle |
Command | cmd | cmdCancel |
Data | dat | datBiblio |
Directory list box | dir | dirSource |
Drive list box | drv | drvTarget |
File list box | fil | filSource |
Frame | fra | fraLanguage |
Form | frm | frmMain |
Group push button | gpb | gpbChannel |
Horizontal scroll bar | hsb | hsbVolume |
Image | img | imgIcon |
Label | lbl | lblHelpMessage |
Line | lin | linVertical |
List box | lst | lstResultCodes |
MDI child form | mdi | mdiContact |
Menu | mnu | mnuFileOpen |
OLE container | ole | olePhoto |
Option button | opt | optSpanish |
Panel | pnl | pnlSettings |
Picture box | pic | picDiskSpace |
Picture clip | clp | clpToolbar |
Shape | shp | shpCircle |
Text box | txt | txtAddress |
Timer | tmr | tmrAlarm |
Vertical scroll bar | vsb | vsbRate |
Prefixes for ActiveX Controls
Control | Prefix | Example |
---|---|---|
Common dialog | dlg | dlgFileOpen |
Communications | com | comFax |
Data-bound combo box | dbc | dbcContacts |
Grid | grd | grdInventory |
Data-bound grid | dbg | dbgPrices |
Data-bound list box | dbl | dblSalesCode |
List view | lvw | lvwFiles |
MAPI message | mpm | mpmSentMessage |
MAPI session | mps | mpsSession |
MCI | mci | mciVideo |
Outline | out | outOrgChart |
Report | rpt | rptQtr1Earnings |
Spin | spn | spnPages |
Tree view | tre | treFolders |
Prefixes for Database Objects
Object | Prefix | Example |
---|---|---|
Database | db | dbCustomers |
Field (object or collection) | fld | fldLastName |
Index (object or collection) | idx | idxAge |
QueryDef | qry | qrySalesByRegion |
Recordset | rst | rstSalesByRegion |
Report | rpt | rptAnnualSales |
TableDef | tbl | tblCustomer |