You are on page 1of 19

Differences Between

Microsoft Visual
Basic .NET and
Microsoft Visual C#
.NET
Microsoft Product Support Services White Paper
Written by May Ji
Additional contributions by Margaret Gong
Published on February 11, 2002
Abstract
This white paper discusses the dierences in synta! between the Microsot" #isual $asic %&'T(
and Microsot" #isual )* %&'T( progra++ing languages% #isual $asic %&'T and #isual )*
%&'T dier in ter+s o case sensiti,ity, ,ariable declaration and assign+ent, data types,
state+ent ter+ination, state+ent bloc-s, use o parentheses ,ersus brac-ets, operators,
conditional state+ents, error handling, o,erlow chec-ing, para+eter passing, late binding, ways
o handling un+anaged code, and -eywords%
The information contained in this document represents the current view of Microsoft Corporation on the issues
discussed as of the date of publication. Because Microsoft must respond to changing market conditions, it
should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the
accuracy of any information presented after the date of publication.
This White Paper is for informational purposes only. MC!"#"$T M%&'# (" W%!!%(T'#, ')P!'## "!
MP*'+, %# T" T,' ($"!M%T"( ( T,# +"C-M'(T.
Complying with all applicable copyright laws is the responsibility of the user. Without limiting the rights under
copyright, no part of this document may be reproduced, stored in or introduced into a retrieval system, or
transmitted in any form or by any means .electronic, mechanical, photocopying, recording, or otherwise/, or for
any purpose, without the e0press written permission of Microsoft Corporation.
Microsoft may have patents, patent applications, trademarks, copyrights, or other intellectual property rights
covering sub1ect matter in this document. '0cept as e0pressly provided in any written license agreement from
Microsoft, the furnishing of this document does not give you any license to these patents, trademarks,
copyrights, or other intellectual property.
2332 Microsoft Corporation. %ll rights reserved.
Microsoft, 4isual Basic .('T, 4isual C55, and 4isual C6 .('T are either registered trademarks or trademarks of
Microsoft Corporation in the -nited #tates and7or other countries.
The names of actual companies and products mentioned herein may be the trademarks of their respective
owners.
CONTENTS
INTRODUCTION........................................................................................................... 1
DIERENCES BET!EEN VISU"# B"SIC .NET "ND VISU"# C# . NET.......................$
Case Sensitivity 2
Variable Declaration and Assignment 2
Data Types
Statement Termination
Statement !loc"s #
$se of %& vs' ( ) #
*perators +
Conditional Statements ,
-rror .andling ,
*verflo/ Chec"ing 0
Parameter Passing 0
1ate !inding 2
.anding $nmanaged Code 34
5ey/ords 34
CONC#USION............................................................................................................ 1%
INTRODUCTION
Because of the past differences between Microsoft Visual Basic, Microsoft
Visual C, and Microsoft Visual C++, many developers have the impression
that Microsoft Visual C# .!" is a more powerful lan#ua#e than Microsoft
Visual Basic .!". $ome developers assume that many thin#s that are possible
in Visual C# .!" are impossible in Visual Basic .!", %ust as many thin#s that
are possible in Microsoft Visual C &.' and earlier or Microsoft Visual C++
&.' and earlier are impossible in Microsoft Visual Basic &.' and earlier. "his
assumption is incorrect. (lthou#h differences e)ist between Visual Basic .!" and
Visual C# .!", they are both first*class pro#rammin# lan#ua#es that are based
on the Microsoft .!" +ramewor,, and they are e-ually powerful. Visual
Basic .!" is a true ob%ect*oriented pro#rammin# lan#ua#e that includes new and
improved features such as inheritance, polymorphism, interfaces, and
overloadin#. Both Visual Basic .!" and Visual C# .!" use the common
lan#ua#e runtime in the .!" +ramewor,, and almost no performance issues now
e)ist between them. Visual Basic .!" may be oriented more toward ease of use
by providin# features such as late bindin#, and Visual C# .!" may have a few
more .power/ features, such as handlin# unmana#ed code, but the differences
are very small compared to what they were in the past.
"his document discusses differences between Visual Basic .!" and Visual C#
.!". 0owever, the ,ey point to ,eep in mind is that .!" is intended to be
lan#ua#e*independent. "he choice between Visual Basic .!" and Visual C# .!"
is typically based on your personal preference and past e)perience1 for e)ample,
it is easier for Visual Basic &.' developers to use Visual Basic .!", and for Visual
C++ and 2ava pro#rammers to use Visual C# .!". "he e)istin# e)perience of a
pro#rammer far outwei#hs the small differences between the two lan#ua#es.
DIERENCES BET!EEN VISU"# B"SIC .NET "ND VISU"# C# .NET
$yntactically, Visual Basic .!" and Visual C# .!" are two different lan#ua#es,
%ust as Visual Basic, Visual C, and Visual C++ are different lan#ua#es. Visual
C# .!" loo,s more familiar to Visual C, Visual C++, and 2ava pro#rammers, and
Visual Basic .!" loo,s more familiar to Visual Basic developers. "he bi##est
differences between the lan#ua#es fall into the followin# cate#ories3
Case sensitivity
Variable declaration and assi#nment
4ata types
$tatement termination
$tatement bloc,s
5se of 67 vs. 89
:perators
Conditional statements
!rror handlin#
:verflow chec,in#
;arameter passin#
<ate bindin#
0andlin# unmana#ed code
=eywords
Case Sensiti&it'
>dentifier names in Visual Basic .!" are not case*sensitive, but identifier names
in Visual C# .!" are. "his primarily presents a problem when you write code,
and is not an issue in debu##in# a pro#ram that already compiles.
Varia(le Declaration and "ssi)n*ent
Variables in Visual Basic .!" are declared with the variable before the data type.
>n Visual C# .!", the data type precedes the variables.
Visual Basic .NET Visual C# .NET
Dim i, j As Integer int i, j;
Dim i As Integer = 7 int i = 7;
Dim i(6) As Integer
or
Dim i() As Integer = New Integer(6) {}
int[] i = new int[6];
Dim con As Sqlonnection Sqlonnection con;
Dim ! As New "(#A$#)
or
Dim ! As " = New "(#A$#)
" ! = new "(#A$#);
Data T'+es
$imple data types have different names in Visual Basic .!" and Visual C# .!". +or
e)ample, Integer in Visual Basic .!" is int in Visual C# .!". 0owever,
System.Int32, the .!" +ramewor, base type for which Integer and int are
aliases, can be used in both lan#ua#es. Visual C# .!" also supports the signed
byte, unsigned short, unsigned int, and unsigned long data types, which are
not available in Visual Basic .!".
"he followin# table lists the different data type names in each lan#ua#e and the base
types for which they are aliases.
Visual Basic .NET Visual C# .NET .NET Framework
Boolean bool System.Boolean
Byte byte System.Byte
Short short System.Int16
Integer int System.Int32
Long long System.Int64
Single float System.Single
Double double System.Double
Decimal decimal System.Decimal
Date System.DateTime System.DateTime
String string System.String
har char System.har
!b"ect ob"ect System.!b"ect
n?a sbyte System.Sbyte
n?a ushort System.#Int16
n?a uint System.#Int32
n?a ulong System.#Int64
State*ent Ter*ination
$tatements in Visual Basic .!" are terminated by the end of the line. @ou can use
the colon 637 to put multiple statements in a line, and you can use the line
continuation 6A7 character to ma,e a statement span several lines.
$tatements in Visual C# .!" are terminated by the semicolon 617. @ou can use
multiple statements per line, and statements can span multiple lines.
Product .upport .er,ices White Paper /
Visual Basic .NET Visual C# .NET
A = %
$ = 7 & = '
()S*+ (Arg,, -
Arg., -
Arg/)
A = %;
$ = 7; = ';
()S*+ (Arg,,
Arg.,
Arg/);
State*ent Bloc,s
Visual Basic .!" does not use arbitrary statement bloc,s. >nstead, certain
,eywords that have a specialiBed terminatin# statement are used instead of the
statement bloc,s.
>n Visual C# .!", braces 6CD7 are used to delimit a statement bloc,1 otherwise, a
sin#le statement is assumed.
Visual Basic .NET Visual C# .NET
I0 A = % 12en
DoSomet2ing()
DoSomet2ingAg3in()
4n5 I0
I0 (3 == %)
{
DoSomet2ing();
DoSomet2ingAg3in();
}
or
i0 (3 == %)
DoSomet2ing();
DoSomet2ingAg3in(); 6612is is not
73rt o0

66t2e i0 st3tement8
Use of -. &s. / 0
Visual Basic .!" uses parentheses 67 to delimit array elements, function ar#uments,
and property inde)es.
Visual C# .!" uses parentheses 67 to delimit function ar#uments, and brac,ets 6897
to delimit array elements and property inde)es.
Purpose Visual Basic .NET Visual C# .NET
4eclare an array
Dim 3() As 9ong
Dim 3(/, %) 3s Integer
int[] ! = new int[%];
>nitialiBe an array
Dim 3() As 9ong = {/, :,
%}
int[] ! = new int[%] {,,
., /, :, %};
Eeallocate array
;e5im n63
+unctions (r#uments
<= A(%)
()S*+ (A, $, )
()S*+(A, $, );
;roperty >nde)es
" = ()D3t3Set813+les-
(#A*t2or#)8;ows(%)8-
ol*mns(#A*t2orID#)
" =
()D3t3Set813+les[#A*t2or
#]8;ows[%]8ol*mns[#A*t2
orID#]
O+erators
"he operators that are used in Visual Basic .!" and Visual C# .!" are -uite
different. "he followin# table lists the main operators. "his information can also be
found in the Microsoft Visual $tudio .!" documentation.
Operator Visual Basic .NET Visual C# .NET
$dditi%e

(ddition
= =
$ubtraction
> >
&ulti'licati%e

Multiplication
? ?
4ivision
6 6
>nte#er division
@ 6

(5e7en5ing on t2e o7er3n5s)
Modulus 6division returnin#
only the remainder7
(o5 A
!)ponentiation
B n63
$ssignment

(ssi#nment
=
== >= ?= 6?
=
== >= ?= 6?
>nte#er division
@=

6=

(5e7en5ing on t2e o7er3n5s)
Concatenate
C= ==
Modulus
n63 A=
<eft shift
n63 DD=
Ei#ht shift
n63 EE=
Bitwise (4
n63 C=
F:E
n63 B=
:E
n63 F=
(elational and e)uality

<ess than
D D
<ess than or e-ual to
D= D=
Greater than
E E
Greater than or e-ual to
E= E=
!-ual
= ==
ot e-ual
DE G=
Product .upport .er,ices White Paper 0
Operator Visual Basic .NET Visual C# .NET
Compare two ob%ect
reference variables
Is ==
Compare ob%ect reference
type
1)7eH0 ! Is l3ss, ! is l3ss,
Compare strin#s
= == or String84q*3ls()
Concatenate strin#s
C =
$hortcircuited Boolean (4
An5Also CC
$hortcircuited Boolean :E
Hr4lse FF
Shift

<eft shift
n63 DD
Ei#ht shift
n63 EE
Sco'e resolution

$cope resolution
8 8, +3se
*ostfi+

"ype cast
int, D+l, I, 1)7e (t)7e)
Member selection
8 8
;ostfi) increment
n63 ==
;ostfi) decrement
n63 >>
#nary

>ndirection
n63 ? (*ns30e mo5e onl))
(ddress of
A55ressH0 C (*ns30e mo5e onl))
<o#ical :"
Not G
:neHs complement
Not J
;refi) increment
n63 ==
;refi) decrement
n63 >>
$iBe of type
n63 siKeo0
Bit,ise

Bitwise :"
Not J
Bitwise (4
An5 C
Operator Visual Basic .NET Visual C# .NET
Bitwise F:E
<or B
Bitwise :E
Hr F
Logical

<o#ical (4, :E
An5 CC
<o#ical :E
Hr FF
onditional

Conditional
II0 L&
*ointer to member

;ointer to member
n63 8 (Mns30e mo5e onl))
Conditional State*ents
"he followin# table lists the differences in the conditional statements that Visual
Basic .!" and Visual C# .!" use.
Conditional Statement Visual Basic .NET Visual C# .NET
4ecision structure 6selection7
Select 3se I, 3se, 3se
4lse, 4n5 Select
switc2, c3se, 5e03*lt,
4ecision structure 6if I then7
I0 I 12en, 4lseI0 I 12en,
4lse, 4n5 I0
i0, else
<oop structure 6conditional7
N2ileI 4n5 N2ile, Do
[N2ile, Mntil] I, 9oo7
[N2ile, Mntil]
5o, w2ile, contin*e
<oop structure 6iteration7
Oor I, [4!it Oor,] Ne!t
Oor 43c2 I, [4!it Oor,]
Ne!t
0or, 0ore3c2
Control flow statement
4!it, Po1o, Sto7, 4n5,
;et*rn,
+re3Q, contin*e, goto,
ret*rn,
t2row
Error 1andlin)
5nstructured error handlin# is for bac,ward compatibility. Visual Basic .!" supports
both structured and unstructured error handlin#, but Visual C# .!" supports only
structured error handlin#.
Product .upport .er,ices White Paper 1
Purpose Visual Basic .NET Visual C# .NET
$tructured error handlin#
1r)
I
3tc2
I
Oin3ll)
I
4n5 1r)
tr), c3tc2, 0in3ll),
t2row
5nstructured error handlin#
Hn 4rror Po1o I
Hn 4rror ;es*me Ne!t
n63
O&erflow C2ec,in)
Visual Basic .!" has a pro%ect level settin# to chec, for overflow. 0owever, the
chec,in# can only be turned on and off at the pro%ect level, instead of at the level of
an e)pression or a bloc, of code. "o turn overflow chec,in# on and off, follow these
steps3
J. :n the *ro"ect menu, clic, *ro'erties.
K. 5nder onfiguration *ro'erties, select !'timi-ations, and then select or
clear (emo%e integer o%erflo, chec.s.
Visual C# .!" statements can run in either a chec,ed or an unchec,ed conte)t. >n a
chec,ed conte)t, arithmetic overflow raises an e)ception error. >n an unchec,ed
conte)t, arithmetic overflow is i#nored and the result is truncated. "his can be used
on an e)pression or a bloc, of code.
3ara*eter 3assin)
Visual Basic .!" uses By/al for passin# parameters by value, and uses By(ef for
passin# parameters by reference. Visual Basic .!" can also force parameters to be
passed by value, re#ardless of how they are declared, by enclosin# the parameters in
e)tra parentheses. Visual Basic .!" also supports optional parameters, which are
not available in Visual C# .!".
Visual C# .!" does not have a way to pass reference types 6ob%ects7 strictly by
value. @ou can either pass the reference 6basically a pointer7 or a reference to the
reference 6a pointer to a pointer7. 5nmana#ed Visual C# .!" methods can ta,e
pointers %ust li,e Visual C++ methods. "o pass a parameter by reference, Visual
C# .!" uses the ref ,eyword. "o use a ref parameter, the ar#ument must e)plicitly
be passed to the method as a ref ar#ument. "he value of a ref ar#ument is passed
to the ref parameter.
Purpose Visual Basic .NET Visual C# .NET
;ass by value
R*+lic S*+ A$ ($)S3l )
As 9ong)
I
4n5 S*+
A$(!)
A$((!))
Toi5 A$(int !)
{
888
}
A$(i);
;ass by reference
R*+lic S*+ A$($);e0 ) As
9ong)
I
4n5 S*+
A$(!)
Toi5 A$(re0 int !)
{
888
}
A$(re0 i);
:ptional parameter $upported n?a
#ate Bindin)
Both Visual Basic .!" and Visual C# .!" can implement implicit late bindin#
throu#h reflection. 0owever, implementin# late bindin# in Visual Basic .!" is much
easier than in Visual C# .!".
>n Visual Basic .!", as in Visual Basic &.', the Visual Basic compiler calls a helper
method behind the scenes that uses reflection to obtain the ob%ect type. "he
ar#uments that are passed to the helper method cause the appropriate method to be
invo,ed at run time. "hese ar#uments are the ob%ect on which to invo,e the method,
the name of the invo,ed method that is a strin#, and the ar#uments that are passed
to the invo,ed method that is an array of ob%ects. (dditionally, you can implement
late bindin# e)plicitly in code throu#h reflection.
Im7orts S)stem
(o5*le Uello
S*+ (3in()
V Set *7 T3ri3+le8
Dim 2elloH+j As H+ject
V re3te t2e o+ject8
2elloH+j = new UelloNorl5()
V InToQe t2e 7rint met2o5 3s i0 it w3s e3rl) +o*n5
V eTen t2o*g2 it is re3ll) l3te +o*n58
2elloH+j8RrintUello(#Sis*3l $3sic 93te $o*n5#)
4n5 S*+
4n5 (o5*le
>n Visual C# .!", implementin# late bindin# is more difficult than in Visual Basic
.!". >nstead of havin# the compiler implement late bindin#, you must e)plicitly
implement late bindin# in code by usin# reflection.
Product .upport .er,ices White Paper 2
1andin) Un*ana)ed Code
Visual C# .!" permits you to write unmana#ed code. >n unmana#ed code, you can
do thin#s such as declare and operate on pointers, perform conversions between
pointers and inte#ral types, and ta,e the address of variables. >n a sense, writin#
unmana#ed code is much li,e writin# Visual C code in a Visual C# .!" pro#ram.
Because code that is written by usin# an unmana#ed conte)t cannot be verified to be
safe, it is run only when the code is fully trusted. 4o not use unmana#ed conte)t to
try to write Visual C code in Visual C# .!". 5nmana#ed code must be clearly
mar,ed with the modifier unsafe so that developers cannot use unmana#ed features
accidentally, and the e)ecution en#ine wor,s to ma,e sure that unmana#ed code
cannot be run in a non*trusted environment. "he scope of the unmana#ed conte)t
e)tends from the parameter list to the end of the function, so pointers can also be
used in the parameter list.
>n Visual Basic .!", you cannot write unmana#ed code.
4e'words
"he followin# table lists the ,eywords that Visual Basic .!" and Visual C# .!" use
in several cate#ories. "his information can also be found in the Visual $tudio .!"
online documentation.
Purpose Visual Basic .NET Visual C# .NET
!b"ect !riented
*rogramming
>ndicates a class constructor
R*+lic l3ss l3ss,
R*+lic S*+ New(88)
()$3se8New
I
4n5 S*+
I
4n5 l3ss
ote3 @ou have to call the
base class constructor
e)plicitly in Visual Basic
.!".
7*+lic cl3ss l3ss,
{
7*+lic l3ss,(88)
{
I
}
I8
}
ote3 "he call to the base
class constructor 6base677 is
#enerated automatically by
the compiler in Visual C#
.!" if you do not include
constructor initialiBers%
>ndicates a class destructor
ote3 "he Destructor or
0inali-e method is called by
#arba#e collection.
Rrotecte5 HTerri5es S*+
Oin3liKe()
m-P35get = Not2ing
m-Pe3r = Not2ing
()$3se8Oin3liKe()
4n5 S*+
7*+lic cl3ss l3ss,
{
7*+lic Jl3ss,()
{
I8
}
}
4eclares a class
l3ss cl3ss
Purpose Visual Basic .NET Visual C# .NET
>ndicates class inheritance
R*+lic l3ss A
In2erits $
I
4n5 l3ss
7*+lic cl3ss A & $
{
I
}
>ndicates that the class can
only be inherited and cannot
be instantiated
(*stIn2erit 3+str3ct
>ndicates that the class
cannot be inherited
NotIn2erit3+le se3le5
Calls your own
implementation of the
method instead of an
overridden method in the
derived class
()l3ss None
Eefers to a base class from
the derived class
()$3se +3se
4eclares a type*safe
reference to a class method
Deleg3te 5eleg3te
>ndicates that the method or
the property overrides the
implementation in its base
class
HTerri5es oTerri5e
>ndicates that these methods
have no implementation and
must be implemented in
derived classes
(*stHTerri5e
(in (*stIn2erit
cl3ss)
3+str3ct
(in 3+str3ct
cl3ss)
>ndicates that the method or
the property cannot be
overridden in derived classes
NotHTerri53+le
ote3 By default, methods are
not overridable.
se3le5
>ndicates that the method or
the property can be
overridden in an inheritin#
class
HTerri53+le Tirt*3l
:verloads a procedure, a
function, or a method
HTerlo35s None8 De0ine 0*nctions
wit2 s3me n3me +*t
5i00erent sign3t*res8
$pecifies that a variable can
contain an ob%ect whose
events you want to handle
Nit24Tents No s7eci0ic Qe)wor5
Product .upport .er,ices White Paper 11
Purpose Visual Basic .NET Visual C# .NET
$pecifies the events for
which an event procedure
will be called
U3n5les (4Tent 7roce5*res
c3n still +e 3ssoci3te5
wit2 3 Nit24Tents T3ri3+le
+) n3ming 73ttern8)
n63
!valuates an ob%ect
e)pression one time to
access multiple members
Nit2 o+j4!7r
D8mem+erE
D8mem+erE
4n5 Nit2
n63
Eefers to the current ob%ect
(e 12is
4eclares an enumerated type
4n*m
I
4n5 4n*m
4n*m
4eclares an interface
Inter03ce inter03ce
>mplements an interface
Im7lements cl3ss , & I,
>ndicates an inde)er
De03*lt Rro7ert) 7*+lic string t2is[int
in5e!]
{
get {ret*rn
9ist[in5e!];}
set {9ist[in5e!]=T3l*e;}
}
lass $ccess &odifiers
>ndicates that the modifier is
accessible outside the
pro%ect or the assembly
R*+lic 7*+lic
>ndicates that the modifier is
accessible inside the
assembly only
Orien5 intern3l
>ndicates that the modifier is
accessible only in the pro%ect
6for nested classes, in the
enclosin# class7
RriT3te 7riT3te
lass &ember $ccess
&odifiers
>ndicates that the modifier is
accessible outside the class
and the pro%ect
R*+lic 7*+lic
>ndicates that the modifier is
accessible outside the class,
but in the pro%ect
Orien5 intern3l
Purpose Visual Basic .NET Visual C# .NET
>ndicates that the modifier is
only accessible in a class or a
module
RriT3te 7riT3te
>ndicates that the modifier is
accessible only to current
and derived classes
Rrotecte5 7rotecte5
>ndicates the union of
;rotected and +riend or
>nternal
Rrotecte5 Orien5 7rotecte5 intern3l
>ndicates that the members
are shared across all
instances
S23re5 st3tic
&iscellaneous Lifetime
;reserves the local variables
for the procedure
St3tic n63
!ther
Calls the Lindows (;>
Decl3re st3tement *se Rl3t0orm InToQe
>ndicates a comment
W, ;em 66, 6? ?6 0or miltine
comments,
666 0or <(9 comments
>ndicates a constant
onst onst, re35onl)
Creates a new ob%ect
New, re3teH+ject new
4eclares a function or a
method with no return value
S*+ Toi5
4eclares that an ob%ect can
be modified asynchronously
n63 Tol3tile
4eclares a variable
RriT3te, R*+lic, Orien5,
Rrotecte5, St3tic, S23re5,
Dim
5ecl3r3tors (Qe)wor5s
incl*5e *ser>5e0ine5 t)7es
3n5 +*ilt>in t)7es)
4eclares a variable e)plicitly
H7tion 4!7licit None (All T3ri3+les m*st
+e 5ecl3re5 +e0ore *se)
4eclares and raises an event
4Tent, ;3ise4Tent eTent
4eclares a structure
Str*ct*re
I
4n5 Str*ct*re
str*ct
4efines a default property
De03*lt +) *sing in5e!ers
4eclares a null ob%ect
Not2ing n*ll
Product .upport .er,ices White Paper 1/
Purpose Visual Basic .NET Visual C# .NET
4eclares a namespace
N3mes73ce
I
4n5 N3mes73ce
N3mes73ce
{
I
}
>ndicates namespace usa#e
Im7orts *sing
Eetrieves a character from a
strin#
Pet23r O*nction [ ]
Eeturns the address of a
function
A55ressH0 (Oor cl3ss
mem+ers, t2is o7er3tor
ret*rns 3 re0erence to 3
0*nction in t2e 0orm o0 3
5eleg3te inst3nce)
5eleg3te
"ests for a null ob%ect
H+j Is Not2ing o+j == n*ll
"ests for a database null
e)pression
IsD+N*ll n63
"hreads primitives
S)nc9ocQ locQ
CONC#USION
Based on your personal preference and past e)perience, you can use either Visual
Basic .!" or Visual C# .!" to build solutions. (lthou#h differences do e)ist
between the two lan#ua#es, both lan#ua#es use the .!" +ramewor, common
lan#ua#e runtime and are e-ually powerful. "his document only briefly discusses the
differences in synta) between Visual Basic .!" and Visual C# .!". +or more
detailed information about these differences and other differences that e)ist between
the two pro#rammin# lan#ua#es, see the Visual $tudio .!" online help.
Product .upport .er,ices White Paper 10

You might also like