V B.NET, còn g i là VB7, ch ng qua là C# vi t theo l i Visual Basic. Nay VB7 đã hoàn toàn là Object Oriented, t c là cho ta dùng l i (reuse) classes/forms theo cách th a k th t tho i mái, nên nó khác VB6 nhi u l m.
D u v y, đ i v i VB6 programmers h c VB.NET không khó. Lý do là VB.NET không cho thêm nhi u t m i (reserved words). Nói chung các ý ni m m i trong VB.NET đ u d l nh h i, nh t là khi đem ra áp d ng cách th c t . ó là nh Microsoft v n gi nguyên t c d u và làm s n
(c a VB6) nh ng gì r c r i phía sau sân kh u, đ ta có th t p trung vào vi c tìm ki m m t gi i pháp, thay vì quá b n tâm vào cách th c làm m t vi c gì. Chính nguyên t c y đã giúp Microsoft chiêu m đ c 3 tri u VB6 programmers trên kh p th gi i. VB.NET c ng hi n cho VB programmers m t công c r t h u hi u đ dùng cho m i hoàn c nh, t database, desktop, distributed, internet cho đ n real-time hay mobile (pocket PC).
Nh ng u đi m (features) c a VB.NET đ n t ch c n ng c a .NET Framework. Nó mang đ n ph ng ti n l p trình cho m ng cách Object Oriented nh XML, Remoting, Streaming, Serialisation, Threading .v.v... Nh ng th này tuy l nh ng không khó h c, ng c l i s ti t ki m r t nhi u thì gi .
M c d u VB6 là m t ngôn ng l p trình tr ng thành và hi u n ng, ch c ch n hãy còn t n t i trong nhi u n m n a, nh ng h c thêm VB.NET là m t đ u t t ng đ i ít t n kém và đ m b o huê l i g p bao nhiêu l n trong hàng th p niên t i.
Trong bài này ta s bàn v nh ng đi m khác nhau gi a VB6 và VB.NET t quan đi m ngôn ng l p trình. Trong m t bài khác ta s bàn v nh ng ch c n ng i t ng (Object Oriented) c a VB.NET.
Namespaces
Namespaces là m t cách đ t tên đ giúp s p đ t các Classes ta dùng trong program m t cách th t h u d tìm ki m chúng. T t c code trong
.NET, vi t b ng VB.NET, C# hay ngôn ng nào khác, đ u đ c ch a trong m t namespace.
i m này c ng áp d ng cho code trong .NET system class libraries. Ch ng h n, các classes c a WinForms đ u n m trong System.Windows.Forms namespace. Và các classes dùng cho collections nh Queue, Stack, Hashtable .v.v.. đ u n m trong System.Collections namespace.
T t c code ta vi t trong program c a mình c ng đ u n m trong các namespaces.
Tr c đây trong VB6, m i khi nh c đ n m t Class trong m t COM tên
CompName ta vi t CompName.classname (còn g i là PROGID) , t c là
c ng dùng m t d ng namespace.
Tuy nhiên ph ng pháp này có m t vài gi i h n:
• a ch c a class b bu c c ng vào component đang ch a nó.
• Nh ng classes không n m trong m t COM component thì không có "namespace".
• Cách g i tên PROGID ch có m t b c thôi, không có b c con, b c cháu.
• Tên c a Component luôn luôn có hi u l c trên kh p c computer.
Namespaces trong .NET kh c ph c đ c m i gi i h n nói trên trong VB6.
Nhi u assemblies có th n m trong cùng m t namespace, ngh a là classes tuyên b trong các components khác nhau có th có chung m t namespace. i u này c ng áp d ng xuyên qua các ngôn ng , giúp cho m t class vi t trong VB.NET có th n m trong cùng m t namespace v i m t class vi t trong C#, ch ng h n.
th ng ta ch dùng m t namespace duy nh t cho t t c các classes trong y.
Nh là m t assembly trong .NET thì đ i khái t ng đ ng v i m t COM component. T t c code trong .NET đ u n m trong nh ng assemblies.
By default, tên c a project đ c dùng làm namespace. N u b n right click lên project name NETListbox trong Solution Explorer c a program Demo, r i ch n Properties trong popup menu, IDE s hi n th Property
Pages dialog nh d i đây:
B n th y Root namespace c a project là NETListbox. B n có th thay
đ i tên namespace y n u b n mu n.
Namespaces có th đ c phân chia th b c gi ng nh Folders trong m t File Directory. Nó s giúp user s p đ t các classes theo đúng nhóm cho trong sáng và d đ c. Thí d b n đang vi t m t program cho m t h ng s n xu t, b n s dùng namespace NhàS nXu t root level. Bên trong namespace y b n s t o thêm các nhánh c a ch ng trình nh :
• NhàS nXu t.T nKho
• NhàS nXu t.S nPh m
• NhàS nXu t.K Toán.ChiPhí
Nh th ta đã đ nh ngh a m t base namespace tên NhàS nXu t, v i nh ng namespaces con, cháu bên trong, m i namespace có ch a classes, modules, enums, structures và các namespaces khác.
M i namespace ch a nh ng ph n c a code thích h p cho nó trong program nói chung. Trong File Directory, ta có th có hai files dù mang cùng tên nh ng n m trong hai folders khác nhau. Gi ng nh v y, trong .NET ta có th có hai classes có cùng m t tên nh ng n m trong hai namespaces khác nhau. ó là vì khi ta vi t tên c a m t class v i c namespace c a nó thì có th phân bi t v i m t class khác v i cùng tên.
Local và Global Namespaces
Khác v i COM components v i "namespace" c a chúng áp d ng cho kh p c computer, namespaces c a .NET thông th ng là Local, ch có application program c a nó th y mà thôi. .NET c ng h tr Global
namespace, nh ng ph i đ c ký tên (digitally signed) và đ ng ký v i .NET runtime đ ch a nó trong global assembly cache. Công vi c làm m t namespace Global r c r i nh th đ gi m thi u tr ng h p ta tr v tình tr ng DLL hell tr c đây.
Dùng Namespaces
Ta có th dùng namespaces b ng cách nói th ng ra (explicitly) v i nguyên tên (Direct Addressing) hay hàm ý (implicitly) v i Import keyword. Nh ng đi u tiên quy t là ta ph i reference cái assembly ch a namespace mà ta mu n dùng. Ta th c hi n vi c y v i Menu command
Project | Add References. Khi Add References dialog hi n ra, ch n Tab .NET cho standard .NET components hay Tab Projects cho DLL c a
m t .NET project khác , highlight DLL b n mu n r i click Select button, đo n click OK.
Ch ng h n ta mu n read và write t stdio (cái console input/output stream). Cái namespace ta c n s là System.Console. Trong cách Direct
Addressing ta s code nh sau đ vi t hàng ch "Chào th gi i": System.Console.WriteLine ("Hello world!")
N u ta dùng Import keyword b ng cách nhét vào câu Imports
System.Console đ u code module, ta có th code g n h n: WriteLine ("Hello world!")
D i đây là m t s namespaces thông d ng:
Namespace Ch c n ng Classes đi n hình
System.IO c/Vi t files và các data streams khác
FileStream, Path, StreamReader, StreamWriter
System.Drawing h a Bitmap, Brush, Pen Color, Font, Graphics
System.Data Qu n lý data DataSet, DataTable, DataRow, SQLConnection, ADOConnection
System.Collection T o và qu n lý các lo i collections
ArrayList, BitArray, Queue, Stack, HashTable
System.Math Tính toán Sqrt, Cos, Log, Min System.Diagnostics Debug Debug, Trace System.XML Làm vi c v i XML,
Document Object Model
XMLDocument, XMLElement, XMLReader, XMLWriter System.Security Cho phép ki m soát an
ninh Cryptography, Permission, Policy
Aliasing Namespaces (dùng bí danh)
Khi hai namespaces trùng tên, ta ph i dùng nguyên tên (k c g c tích) đ phân bi t chúng. i n hình là khi ta dùng nh ng namespaces liên h đ n VB6 nh Microsoft.Visualbasic. Thay vì code:
Microsoft.Visualbasic.Left ( InputString,6) ta tuyên b : Imports VB6= Microsoft.Visualbasic Sau đó ta có th code: VB6.Left ( InputString,6) Dùng Namespaces keyword
Trong thí d v program có Root Namespace là NhàS nXu t nh nói trên, n u ta mu n đ t ra m t namespace con là T nKho, ta ph i dùng NameSpace keyword trong code nh sau:
' Root Namespace là NhàS nXu t Namespace T nKho
Class PhòngL nh
' Code cho Phòng L nh End Class
Bây gi mu n nói đ n class PhòngL nh bên trong namespace T nKho ta s code nh sau:
NhàS nXu t.T nKho.PhòngL nh
Thay đ i trong Data Types
T t c đ u là Object
M t thay đ i l n cho Data Type c a VB.NET, là nh ng variables dùng Data Type đ a ph ng nh Integer, Single, Boolean,.v.v.. đ u là nh ng Objects. Chúng đ u đ c derived (xu t phát) t Class c n b n nh t tên
Object trong VB.NET. N u b n th dùng Intellisense đ xem có bao nhiêu Functions/Properties m t Object lo i Integer có, b n s th y nh d i đây:
Trong .NET, Integer có b n lo i: Byte (8 bits, không có d u, t c là t 0 đ n 255), Short (16 bits, có d u c ng tr , t c là t -32768 đ n 32767),
Integer (32 bits, có d u) và Long (64 bits, có d u). Nh v y Integer bây
gi t ng đ ng v i Long trong VB6, và Long bây gi l n g p đôi trong VB6.
Floating-Point Division (Chia s n i)
Vi c chia s n i (Single, Double) trong VB.NET đ c làm theo đúng tiêu chu n c a IEEE. Do đó n u ta vi t code nh sau:
Dim dValueA As Double
Dim dValueB As Double
dValueA = 1
Console.WriteLine(dValueA / dValueB)
Trong VB6 ta bi t mình s g p Division by Zero error, nh ng đây program s vi t trong Output Window ch Infinity (vô c c). T ng t nh v y, n u ta vi t code:
Dim dValueA As Double
Dim dValueB As Double
dValueA = 0
dValueB = 0
Console.WriteLine(dValueA / dValueB)
K t qu s là ch NaN (Not a Number) hi n th trong Output Window.
Thay th Currency b ng Decimal
VB.NET dùng Decimal data type v i 128 bits đ thay th Currency data type trong VB6. Nó có th bi u di n m t s t i 28 digits n m bên ph i d u ch m đ cho th t chính xác. H càng nhi u digits n m bên ph i d u ch m thì t m tr s c a Decimal càng nh h n.
Char Type
VB.NET có c Byte l n Char data type. Byte đ c dùng cho m t s nh 0-255, có th ch a m t ASCII character trong d ng con s .
Char đ c dùng đ ch a m t Unicode (16 bit) character. Char là m t character c a String.
String Type
Nhìn l t qua, String trong VB.NET không có v khác VB6 bao nhiêu. Nh ng tr khi ta mu n ti p t c dùng các Functions nh InStr, Left, Mid and Right trong VB6, ta nên xem String là m t object và dùng nh ng Properties/Functions c a nó trong VB.NET cho ti n h n. Sau này ta s h c thêm v String c a VB.NET trong m t bài riêng.
Ý ni m fixed-length (có chi u dài nh t đ nh) String trong VB6 không còn dùng n a. Do đó ta không th declare:
Dim myString As String * 25
Object thay th Variant
M t trong nh ng data types linh đ ng, hi u n ng và nguy hi m trong VB6 là Variant. M t variable thu c data type Variant có th ch a g n nh th gì c ng đ c (tr fixed-length string), nó t đ ng thích nghi bên trong đ ch a tr s m i. Cái giá ph i tr cho s linh đ ng y là program ch y ch m và d có bugs t o ra b i s bi n đ i t data lo i này qua lo i khác không theo d tính c a ta.
VB.NET thay th Variant b ng Object. Vì trên ph ng di n k thu t t t c data types trong .NET đ u là Object nên, gi ng nh Variant, Object có th ch a đ th .
Nói chung, d u Object gi ng nh Variant, nh ng trong .NET ta ph i nói rõ ra (explicitly) mình mu n làm gì. Ta th xem m t thí d code trong VB6 nh sau:
Private Sub Button1_Click()
Dim X1 As Variant
Dim X2 As Variant
X1 = "24.7"
X2 = 5
Debug.Print X1 + X2 ' C ng hai s v i operator +
Debug.Print X1 & X2 ' Ghép hai strings l i v i operator &
End Sub
K t qu hi n th trong Immediate Window là :
29.7
24.75
Trong VB.NET, ta ph i code cho rõ ràng h n nh sau đ có cùng k t qu nh trên hi n th trong Output Window:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim X1 As Object Dim X2 As Object X1 = "24.7" X2 = 5 Console.WriteLine(CSng(X1) + CInt(X2)) Console.WriteLine(CStr(X1) & CStr(X2)) End Sub CType Statement
Trong VB.NET có Option Strict by default. Nó b t ta ph i th n tr ng trong cách dùng data types. Vì Object có th ch a b t c th gì, khi ta mu n dùng nó nh m t lo i data type hay class nào, ta ph i đ i Object ra th y b ng CType, thí d :
Class Product
Public Description As String
End Class
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim X As Object
X = New Product()
' Treat X like an actual product
CType(X, Product).Description = "Soft Drink"
Console.WriteLine(CType(X, Product).Description)
End Sub
M c dù X đ c instantiated nh m t Product, nó v n đ c xem nh m t Object variable. Do đó m i khi mu n dùng nó nh m t Product ta ph i nh đ n CType. T chuyên môn trong programming g i đó là Type
Casting.
Thay đ i trong cách tuyên b Variables
Trong VB6 ta có th Declare nhi u variables trên cùng m t hàng nh : Dim i, j, k As Integer
K t qu là ch có k là Integer, còn i và j là Variant (có th đó là đi u b n không ng ). Trong VB.NET thì c ba i,j và k đ u là Integer, và nh th h p lý h n.
Tuyên b tr s kh i đ u
Trong VB6, sau khi declare variable ta th ng cho nó m t tr s kh i đ u nh :
Dim X As Integer
X = 12
Bây gi trong VB.NET ta có th g p chung hai statements trên l i nh sau:
Dim X As Integer = 12
Tuyên b Constants
Khi tuyên b Constants trong VB.NET ta ph i khai rõ Data type c a nó là String, Integer, Boolean ..v.v.:
Public Const myConstantString As String = "happy"
Public Const maxStudent As Integer = 30
Dim As New
Trong VB6 ta đ c khuyên không nên code: Dim X As New Customer
vì VB6 không instantiate m t Object Customer cho đ n khi X đ c dùng đ n - chuy n này r t nguy hi m vì có th t o ra bug mà ta không ng . Trong VB.NET ta có th yên tâm code:
Dim X As New Customer()
vì statement nói trên l p t c t o ra m t Object Customer.
Trong thí d d i đây, variable X đ c declared trong m t IF ..THEN...END IF block. Khi execution ra kh i IF block y, X s b h y di t.
Do đó, VB.NET s than phi n là X undefined vì nó không th y X bên ngoài IF block. Lu t này c ng áp d ng cho nh ng Blocks khác nh DO...LOOP, WHILE...END WHILE, FOR...NEXT, .v.v..
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim A As Integer = 5
Dim B As Integer = 5
If A = B Then
Dim X As Integer ' X is declared in this IF block
X = 12
End If
A = X ' X has been destroyed, so it is undefined here
End Sub
Có l b n h i Declare Variable trong FOR...LOOP có l i gì, t i sao ta không Declare m t l n duy nh t đ u?
Th nh t là Block gi i h n scope (ph m vi ho t đ ng) c a m t variable đ nó không đ ng ch m ai d gây nên bug, th hai là tr ng h p đi n hình ta s c n feature này là trong m t FOR...LOOP, c m i iteration ta mu n instantiate m t Object m i. Khi y ta c n Declare m t Object variable, instantiate Object , r i ch a nó vào m t collection ch ng h n.
Truy c p Variable/Class/Structure
Trong VB.NET ta có th quy t đ nh gi i h n vi c truy c p m t Variable, Class, Structure .v.v. b ng cách dùng các keywords sau:
Lo i truy
c p Thí d Chú thích
Public Public Class
ClassForEverybody
Cho phép đâu c ng dùng nó đ c. Ta ch có th dùng Public m c đ Module, Namespace hay File. T c là ta không th dùng Public trong m t Sub/Function.
Protected Protected Class ClassForMyHeirs
Cho phép các classes con, cháu đ c dùng. Ta ch có th dùng Protected m c đ Class. Friend Friend StringForThisProject As String
Cho phép code trong cùng m t Project đ c dùng.
Private
Private
NumberForMeOnly As Integer
Cho phép code trong cùng module, class, hay structure đ c dùng. L u ý là Dim coi nh t ng đ ng v i Private, do đó ta nên dùng Private cho d đ c.
Ngoài ra, nh là n u container (Object ch a) c a m t Variable/Class/Structure là Private thì dù ta có tuyên b m t Variable/Class/Structure n m bên trong container là Public ta c ng không th y nó t bên ngoài.
Thay đ i trong Array
Array index t 0
Trong VB.NET không có Option Base và m i Array đ u có index b t đ u t 0. Khi b n tuyên b m t array nh :
Dim myArray(10) As Integer
K t qu là m t array có 11 elements và index t 0 đ n 10. UBound c a array này là 10 và LBound c a t t c arrays trong VB.NET đ u là 0.
Tuyên b Array v i nh ng tr s kh i đ u
B n có th tuyên b Array v i nh ng tr s kh i đ u nh sau: Dim myArray() As Integer = { 1, 5, 8, 16 } ' Note the curly brackets
Statement làm hai chuy n: quy t đ nh size c a array và cho các elements tr s kh i đ u. dùng feature này, b n không đ c nói rõ size c a