The first program to write is the same for all languages: Print the words hello, world
—Brian W. Kernighan and Dennis M. Ritchie, The C Programming Language
It has become a tradition for programming books to begin with a hello, world example. The idea is that entering and running a program—any program—may be the biggest hurdle faced by experienced programmers approaching a new platform or language. Without overcoming this hurdle, nothing else can follow. This chapter contains three such examples: one that creates a console application, one that creates a GUI application, and one that creates a browser-based application. Each example stands alone and can be run as is. The console and GUI applications can both be compiled from the command line (yes, Visual Basic .NET has a command-line compiler!). The browser-based application requires a computer running Internet Information Server (IIS).
This is the world’s favorite programming example, translated to Visual Basic .NET:
Imports System Public Module Hello Public Sub Main( ) Console.WriteLine("hello, world") End Sub End Module
This version of hello, world is a
console application --
it
displays its output in a Windows command-prompt window. To compile
this program, enter it using any text editor, such as Windows’s
Notepad, save it in a file whose name ends with
.vb
, such as Hello.vb
, and
compile it from the Windows command line with this command:
vbc Hello.vb
The command vbc
invokes the Visual Basic .NET
command-line compiler, which ships with the .NET Framework SDK, and
instructs it to compile the file named in the command-line argument.
Compiling Hello.vb
generates the file
Hello.exe
. After compiling, type
Hello
at the command line to run your program.
Figure 1-1 shows the results of compiling and
running this program.
If you’re accustomed to programming in Visual Basic 6, you can see even from this little program that Visual Basic has changed dramatically. Here’s a breakdown of what’s happening in this code.
The first line:
Imports System
indicates that the program may use one or more types defined in the
System
namespace
.
(Types are grouped into namespaces to help avoid name collisions and
to group related types together.) Specifically, the hello, world program uses the Console class, which is defined in
the System namespace. The Imports
statement is
merely a convenience. It is not needed if the developer is willing to
qualify type names with their namespace names. For example, the
hello, world program could have been written
this way:
Public Module Hello Public Sub Main( ) System.Console.WriteLine("hello, world") End Sub End Module
However, it is customary to use the Imports
statement to reduce keystrokes and visual clutter.
An important namespace for Visual Basic developers is
Microsoft.VisualBasic. The types in this namespace expose members
that form Visual Basic’s intrinsic functions and subroutines.
For example, the Visual Basic Trim
function is a
member of the Microsoft.VisualBasic.Strings class, while the
MsgBox
function is a member of the
Microsoft.VisualBasic.Interaction class. In addition, Visual
Basic’s intrinsic constants come from enumerations within this
namespace. Much of the functionality available in this namespace,
however, is also duplicated within the .NET Framework’s Base
Class Library. Developers who are not familiar with Visual Basic 6
will likely choose to ignore this namespace, favoring the
functionality provided by the .NET Framework. The .NET Framework is
introduced later in this chapter and is explained in detail in Chapter 3.
Next, consider this line:
Public Module Hello
This line begins the declaration of a standard module named
Hello
. The standard-module declaration ends with
this line:
End Module
In Visual Basic 6, various program objects were defined by placing
source code in files having various filename extensions. For example,
code that defined classes was placed in .cls
files, code that defined standard modules was placed in
.bas
files, and so on. In Visual Basic .NET, all
source files have .vb
filename extensions, and
program objects are defined with explicit syntax. For example,
classes are defined with the Class...End Class
construct, and standard modules are defined with the
Module...End Module
construct. Any particular
.vb
file can contain as many of these
declarations as desired.
The purpose of standard modules in Visual Basic 6 was to hold code that was outside of any class definition. For example, global constants, global variables, and procedure libraries were often placed in standard modules. Standard modules in Visual Basic .NET serve a similar purpose and can be used in much the same way. However, in Visual Basic .NET they define datatypes that cannot be instantiated and whose members are all static. This will be discussed in more detail in Chapter 2.
The next line in the example begins the definition of a subroutine
named Main
:
Public Sub Main( )
It ends with:
End Sub
This syntax is similar to Visual Basic 6. The Sub
statement begins the definition of a
subroutine --
a
method that has no return value.
The Main
subroutine is the entry point for the
application. When the Visual Basic .NET compiler is invoked, it looks
for a subroutine named Main
in one of the
classes or standard modules exposed by the application. If
Main
is declared in a class rather than in a
standard module, the subroutine must be declared with the
Shared
modifier. This modifier indicates that the
class does not need to be instantiated for the subroutine to be
invoked. In either case, the Main
subroutine
must be Public
. An example of enclosing the
Main
subroutine in a class rather than in a
standard module is given at the end of this section.
If no Main
subroutine is found, or if more than
one is found, a compiler error is generated. The command-line
compiler has a switch
(/main:
location
) that
allows you to specify which class or standard module contains the
Main
subroutine that is to be used, in the case
that there is more than one.
Lastly, there’s the line that does the work:
Console.WriteLine("hello, world")
This code invokes the Console class’s WriteLine method, which outputs the argument to the console. The WriteLine method is defined as a shared (also known as a static) method. Shared methods don’t require an object instance in order to be invoked; nonshared methods do. Shared methods are invoked by qualifying them with their class name (in this case, Console).
Here is a program that uses a class instead of a standard module to
house its Main
subroutine. Note that
Main
is declared with the
Shared
modifier. It is compiled and run in the
same way as the standard module example, and it produces the same
output. There is no technical reason to choose one implementation
over the other.
Imports System Public Class Hello Public Shared Sub Main( ) Console.WriteLine("hello, world") End Sub End Class
Here’s the GUI version of
hello, world
:
Imports System Imports System.Drawing Imports System.Windows.Forms Public Class HelloWindows Inherits Form Private lblHelloWindows As Label Public Shared Sub Main( ) Application.Run(New HelloWindows( )) End Sub Public Sub New( ) lblHelloWindows = New Label( ) With lblHelloWindows .Location = New Point(37, 31) .Size = New Size(392, 64) .Font = New Font("Arial", 36) .Text = "Hello, Windows!" .TabIndex = 0 .TextAlign = ContentAlignment.TopCenter End With Me.Text = "Programming Visual Basic .NET" AutoScaleBaseSize = New Size(5, 13) FormBorderStyle = FormBorderStyle.FixedSingle ClientSize = New Size(466, 127) Controls.Add(lblHelloWindows) End Sub End Class
This is similar to the hello, world console
application, but with extra stuff required since this is a GUI
application. Two additional Imports
statements are
needed for drawing the application’s window:
Imports System.Drawing Imports System.Windows.Forms
The HelloWindows class has something that Visual Basic programs have
never seen before, the Inherits
statement:
Inherits Form
The Visual Basic .NET language has class inheritance. The
HelloWindows class inherits from the Form class, which is defined in
the System.Windows.Forms namespace. Class inheritance and the
Inherits
statement are discussed in Chapter 2.
The next line declares a label control that will be used for
displaying the text Hello,
Windows
:
Private lblHelloWindows As Label
The Label class is defined in the System.Windows.Forms namespace.
As is the case with console applications, GUI applications must have
a shared subroutine called Main
:
Public Shared Sub Main( ) Application.Run(New HelloWindows( )) End Sub
This Main method creates an instance of the HelloWindows class and passes it to the Run method of the Application class (defined in the System.Windows.Forms namespace). The Run method takes care of the housekeeping of setting up a Windows message loop and hooking the HelloWindows form into it.
Next is another special method:
Public Sub New( )
Like Main
, New
has special
meaning to the Visual Basic .NET compiler. Subroutines named
New
are compiled into
constructors
.
A constructor is a method that has no return value (but can have
arguments) and is automatically called whenever a new object of the
given type is instantiated. Constructors are explained further in
Chapter 2.
The constructor in the HelloWindows class instantiates a Label
object, sets some of its properties, sets some properties of the
form, and then adds the Label object to the form’s Controls
collection. The interesting thing to note is how different this is
from how Visual Basic 6 represented form design. In Visual Basic 6,
form layout was represented by data in .frm
files. This data was not code, but rather a listing of the properties
and values of the various elements on the form. In Visual Basic .NET,
this approach is gone. Instead, Visual Basic .NET statements must
explicitly instantiate visual objects and set their properties. When
forms are designed in Visual Studio .NET using its drag-and-drop
designer, Visual Studio .NET creates this code on your behalf.
The command line to compile the Hello, Windows program is:
vbc HelloWindows.vb /reference:System.dll,System.Drawing.dll,System.Windows.Forms.dll /target:winexe
(Note that there is no break in this line.)
The command line for compiling the Hello, Windows program has more stuff in it than the one for the
console-based hello, world program. In addition
to specifying the name of the .vb file, this
command line uses the /references
switch to
specify three .dll
s that contain the
implementations of library classes used in the program (Form, Label,
Point, etc.). The hello, world
console
application didn’t require references when being compiled
because all it used was the Console class, defined in the System
namespace. The Visual Basic .NET command-line compiler includes two
references implicitly: mscorlib.dll
(which
contains the System namespace) and
Microsoft.VisualBasic.dll
(which contains helper
classes used for implementing some of the features of Visual Basic
.NET).
Besides the /references
switch, the command line
for compiling the Hello, Windows
program
includes the /target
switch. The
/target
switch controls what kind of executable
code file is produced. The possible values of the
/target
switch are:
-
exe
Creates a console application. The generated file has an extension of
.exe
. This is the default.-
winexe
Creates a GUI application. The generated file has an extension of
.exe
.-
library
Creates a class library. The generated file has an extension of
.dll
.
The output of Hello, Windows
is shown in Figure 1-2.
GUI applications are explained in detail in Chapter 4 and Chapter 5.
Here is a browser-based version of the
hello, world
application. Because the simplest
version of such an application could be accomplished with only HTML,
I’ve added a little spice. This web page includes three buttons
that allow the end user to change the color of the text.
<script language="VB" runat="server"> Sub Page_Load(Sender As Object, E As EventArgs) lblMsg.Text = "Hello, Browser!" End Sub Sub btnBlack_Click(Sender As Object, E As EventArgs) lblMsg.ForeColor = System.Drawing.Color.Black End Sub Sub btnGreen_Click(Sender As Object, E As EventArgs) lblMsg.ForeColor = System.Drawing.Color.Green End Sub Sub btnBlue_Click(Sender As Object, E As EventArgs) lblMsg.ForeColor = System.Drawing.Color.Blue End Sub </script> <html> <head> <title>Programming Visual Basic .NET</title> </head> <body> <form action="HelloBrowser.aspx" method="post" runat="server"> <h1><asp:label id="lblMsg" runat="server"/></h1> <p> <asp:button type="submit" id="btnBlack" text="Black" OnClick="btnBlack_Click" runat="server"/> <asp:button id="btnBlue" text="Blue" OnClick="btnBlue_Click" runat="server"/> <asp:button id="btnGreen" text="Green" OnClick="btnGreen_Click" runat="server"/> </p> </form> </body> </html>
To run this program, enter it using a text editor and save it in a
file named HelloBrowser.aspx
. Because the
application is a web page that is meant to be delivered by a web
server, it must be saved onto a machine that is running IIS and has
the .NET Framework installed. Set up a virtual folder in IIS to point
to the folder containing HelloBrowser.aspx
.
Finally, point a web browser to
HelloBrowser.aspx
. The output of the
Hello, Browser
application is shown in Figure 1-3.
Tip
Be sure to reference the file through the web server machine name or
localhost
(if the web server is on your local
machine), so that the web server is invoked. For example, if the file
is in a virtual directory called Test on your
local machine, point your browser to http://localhost/Test/HelloBrowser.aspx. If
you point your browser directly to the file using a filesystem path,
the web server will not be invoked.
Going into detail on the Hello, Browser code
would be too much for an introduction. However, I’d like to
draw your attention to the <asp:label>
and
<asp:button>
tags. These tags represent
server-side controls
. A server-side control is a class that
is instantiated on the web server and generates appropriate output to
represent itself on the browser. These classes have rich, consistent
sets of properties and methods and can be referenced in code like
controls on forms are referenced in GUI applications.
ASP.NET has many other nifty features, some of which are:
Web pages are compiled, resulting in far better performance over classic ASP.
Code can be pulled out of web pages entirely and placed in
.vb
files (called code-behind files) that are referenced by the web pages. This separation of web page layout from code results in pages that are easier to develop and maintain.ASP.NET automatically detects the capabilities of the end user’s browser and adjusts its output accordingly.
Browser-based applications are discussed in detail in Chapter 6.
Get Programming Visual Basic .NET now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.