Dot Net-Bài 3-Những khác biệt giữa VB.NET với VB6
Tham khảo tài liệu 'dot net-bài 3-những khác biệt giữa vb.net với vb6', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
Bài 3
Những khác biệt giữa VB.NET với VB6
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 realtime 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.
Hơn nữa, trong một assembly có thể có nhiều namespaces, dù rằng thông 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àSảnXuất.KếToán.ThuNhập
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
Đọc/Viết files và các data FileStream, Path, StreamReader,
System.IO
streams khác StreamWriter
System.Drawing Đồ họa Bitmap, Brush, Pen Color, Font, Graphics
DataSet, DataTable, DataRow,
System.Data Quản lý data
SQLConnection, ADOConnection
Tạo và quản lý các loại ArrayList, BitArray, Queue, Stack,
System.Collection
collections HashTable
System.Math Tính toán Sqrt, Cos, Log, Min
System.Diagnostics Debug Debug, Trace
Làm việc với XML, XMLDocument, XMLElement,
System.XML
Document Object Model 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
End Namespace
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.
FloatingPoint 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
dValueB = 0
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ỏ 0255, 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 fixedlength (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
Tuyên bố nhiều 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.
Tuyên bố Variable trong Scope của Block
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
Thí dụ Chú thích
cập
Cho phép ở đâu cũng dùng nó được. Ta chỉ có thể
Public Class dùng Public ở mức độ Module, Namespace hay
Public
ClassForEverybody File. Tức là ta không thể dùng Public trong một
Sub/Function.
Protected Class Cho phép các classes con, cháu được dùng. Ta chỉ
Protected
ClassForMyHeirs có thể dùng Protected ở mức độ Class.
Friend
Friend StringForThisProject As Cho phép code trong cùng một Project được dùng.
String
Cho phép code trong cùng module, class, hay
Private
structure được dùng. Lưu ý là Dim coi như tương
Private NumberForMeOnly As
đương với Private, do đó ta nên dùng Private cho
Integer
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 array, mà để cho program
tự tính.
ReDim Preserve
Trong VB.NET bạn cũng có thể tiếp tục dùng Preserve keyword để giữ nguyên trị số
của các elements trong một array khi bạn ReDim nó. Tuy nhiên có một giới hạn cho
array với hơn một dimension bạn chỉ có thể resize dimention cuối (bên phải) , nên
những hàng code sau đây hợp lệ:
Dim myArray(,) As String
ReDim myArray(5, 5)
ReDim Preserve myArray(5, 8)
Thay đổi trong UserDefined Type
Ý niệm UserDefined Type (UDT) rất tiện cho ta gom các mảnh data liên hệ lại thành
một data type có cấu trúc. Trong VB6 ta dùng nó như sau:
Public Type UStudent
FullName as String
Age as Integer
End Type
VB.NET cũng giữ y đặc tính của UDT nhưng thay đổi chữ Type thành Structure:
Public Structure UStudent
Public FullName as String
Public Age as Integer
End Structure
Lưu ý các Structure Members (như FullName , Age ) cần phải được Declared với
keyword Dim, Public, Private hay Friend, nhưng không thể dùng Protected vì Structure
không thể Inherit từ một Structure khác. Sở dĩ, có dùng Private là vì bên trong
Structure có thể có Property, Sub/Function .v.v..
Thay đổi trong Collections
VB6 hổ trợ Collection và sau nầy Windows Scripting Host Library cho ta collection kiểu
Dictionary. VB.NET cho ta một thành phần collection rất hùng hậu trong Namespace
System.Collections. Vì Collection là một trong những công cụ rất thông dụng và hiệu
năng trong VB.NET nên ta sẽ có một bài dành riêng cho collection sau nầy.
Dưới đây là danh sách các collections ta sẽ dùng thường xuyên:
Collection Chức năng
ArrayList Dynamic Array tự động lớn lên khi elements được bỏ vào.
BitArray Array chứa trị số Boolean (True/False).
HashTable Collection chứa những cặp key-value data, cho ta dùng làm tự điển.
Chứa một FIFO (First In, First Out) structure. Element có thể là bất cứ Object
Queue
loại nào.
Stack Chứa một LIFO (Last In, First Out) structure.
SortedList Chứa một danh sách những cặp key-value data được sắp theo thứ tự.
Arithmetic Operators mới
VB.NET cho ta thêm cách viết Arithmetic Operator mới mà C programmers rất thích từ
lâu nay.
X += 4 tương đương với X = X + 4
Mess &= " text" tương đương với Mess = Mess & " text"
Arithmetic Operation Trong VB6 Cách viết tắc mới
Cộng X = X +5 X += 5
Trừ X = X - 10 X -= 10
Nhân X=X*7 X *= 7
Chia X = X / 19 X /= 19
Chia Integer X = X \ 13 X \= 13
Lũy thừa X=X^3 X ^= 3
Ghép Strings X = X & "more text" X &= "more text"
Ta vẫn có thể tiếp tục dùng cách viết trong VB6, nhưng bây giờ có thêm một cách viết
gọn hơn.
Short Circuit trong IF..THEN Statement
Trong VB6, nếu ta viết:
Dim myInt as Integer
myInt = 0
If (myInt 0) And (17 \ myInt < 5 ) Then
Thì sẽ bị Division by Zero error, vì mặc dầu phần (myInt 0) là False, nhưng VB6
vẫn tiếp tục tính phần
(17 \ myInt Nếu trong VB6 ta viết:
Private mdescription as String
Public Property Let Description (Value As String)
mdescription = Value
End Property
Public Property Get Description() As String
Description = mdescription
End Property
Trong VB.NET Let và Get đuợc hợp lại trong một Property routine duy nhất và ta lại
dùng chữ Set thay cho chữ Let (mặc dầu chữ Set không còn dùng cho Object như mới
nói ở trên) như sau:
Private mdescription As String
Public Property Description() As String
Set (ByVal Value As String)
mdescription = Value
End Set
Get
Description = mdescription
End Get
End Property
ReadOnly và WriteOnly property
Bây giờ nếu Property là ReadOnly ta sẽ viết:
Public ReadOnly Property Age() As Integer
Get
Age = 3
End Get
End Property
hay WriteOnly ta sẽ viết:
Private _data As Integer
Public WriteOnly Property Data() As Integer
Set (ByVal Value As String)
_data = Value
End Set
End Property
Default Properties
Ta dùng Default keyword để tạo ra Default Property như sau:
Default Public Property Item(ByVal Index As Integer) as String
VB.NET bắt buộc ta phải ít nhất một parameter cho Default Property.
Dùng Reserved Word làm Procedure Name
Trong VB.NET ta có thể dùng Reserved Word làm Procedure Name bằng cách để nó
giữa ngoặc vuông. Giả tỉ ta muốn dùng chữ Compare làm tên một Function, ta sẽ viết
như sau:
Public Function [Compare] (ByVal v1 As Integer, ByVal v2 As Integer) As
Boolean
Structured Error Handling
TRY...CATCH...FINALLY
VB.NET cho ta Structure TRY...CATCH...FINALLY...END TRY để xử lý error. Thí dụ
như trong bài toán chia dưới đây, nếu bị Division by 0 error thì ta sẽ cho kết quả bằng
0. Dù có error hay không, program vẫn hiển thị kết quả trong Output Window qua
statement Console.WriteLine( result) trong phần Finally:
Try
result = a / b ' if this section has error jump to Catch section
Catch
' only get here if an error occurs between Try and Catch
result = 0
Finally
' This section is optional, but is always executed whether there is an
error or not
Console.WriteLine( result)
End Try
Nếu ta không code gì ở phần Catch thì có nghĩa là chúng ta có Handle Error nhưng lại
không làm gì hết, do đó Program sẽ không té. Ngược lại, nếu ta không dùng
Try..Catch, thì program sẽ té.
Nếu muốn nhảy ra khỏi Try Structure bất cứ lúc nào ta có thể dùng Exit Try,
Những cách CATCH error
Ta có thể dùng Catch giống như Select Case để có một cách xử lý cho mỗi error:
Try
' Main code goes here
Catch When Err.Number=5
' handle Error 5
Catch
' handle other errors
End Try
Ta có thể Catch Error Exception data trong một variable để dùng nó như sau:
Catch e as Exception
MessageBox.Show (e.ToString)
Hai cách code ở trên có thể được gợp lại thành:
Catch e As Exception When Err.Number = 5
Thay đổi trong cách viết Sub/Function
Dùng dấu ngoặc khi gọi Procedure
Trong VB6, nếu không dùng keyword Call ta không dùng dấu ngoặc khi gọi Sub.
Trong VB.NET ta luôn luôn dùng cặp dấu ngoặc, ngay cả khi không có parameter. Thí
dụ:
ProcessData()
x = New Customer()
ByVal là Default cho mọi Parameters
Trong VB6, ByRef là default cho các parameters passed vô Sub/Function. Tức là,
Sub/Function có thể vô tình làm thay thổi trị số nguyên thủy của parameter variables.
Trong VB.NET, ByVal là default cho các parameters passed vô Sub/Function. Do đó,
nó sẽ tránh lỗi lầm nói trên.
Optional Parameter cần có trị số Default
Trong VB6 ta có thể dùng IsMissing để biết xem Optional parameter có hiện diện
không. VB.NET đã bỏ IsMissing và bắt buộc ta phải cung cấp trị số Default cho
Optional parameter trong phần procedure declaration giống như sau đây :
Public Sub VerifyInput (Optional ByVal InputData as String="")
trong thí dụ nầy ta cho Default value của Optional parameter InputData là Empty
string.
Return Statement
Hãy xem một thí dụ dùng Function để return một Customer Object trong VB6:
Public Function GetCustomer (ByVal CustID As Long) As Customer
Dim objCust As Customer
Set objCust = New Customer
objCust.Load CustID
Set GetCustomer = objCust
End Function
Trong VB.NET ta có thể dùng Return Statement để Return kết quả của một Function
thay vì dùng chính tên của Function.
Public Function GetCustomer (ByVal CustID As Long) As Customer
Dim objCust As New Customer(CustID)
Return objCust
End Function