Bài 3 Nh ng khác bit gia VB.NET vi VB6

Một phần của tài liệu Giới Thiệu Tổng Quan Về VB.Net (Trang 37 - 59)

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í (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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" (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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

Một phần của tài liệu Giới Thiệu Tổng Quan Về VB.Net (Trang 37 - 59)