Lập trình VB.NET - Bài 3

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

pdf16 trang | Chuyên mục: Visual Basic 6.0 | Chia sẻ: dkS00TYs | Lượt xem: 2105 | Lượt tải: 1download
Tóm tắt nội dung Lập trình VB.NET - Bài 3, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 để 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 User-Defined Type 
Ý niệm User-Defined 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. 
Queue Chứa một FIFO (First In, First Out) structure. Element có thể là bất cứ Object 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 < 5 ), và tạo ra error vì 17 chia cho một số 0.Trong vài ngôn ngữ lập trình 
khác, khi (myInt 0) là False thì nó không tính thêm nữa, tức là nó nói rằng khi một phần của 
AND là False thì nhất định kết quả của Logical Statement trong IF phải là False. Ðặc tính nầy gọi 
là Short-Circuit (đi tắc).Nếu ta dùng code nói trên trong VB.NET, nó vẫn cho Division by Zero 
error giống như VB6. Tuy nhiên, nếu ta muốn dùng đặc tính Short-Circuit thì ta chỉ cần thay thế 
chữ And bằng AndAlso như sau: 
Dim myInt As Integer 
myInt = 0 
If (myInt 0) AndAlso (17 \ myInt < 5 ) Then
Short-Circuit cũng áp dụng cho Logical OR khi ta thay thế chữ Or bằng OrElse để nói rằng khi 
phần đầu của OR là True thì nhất định kết quả của Logical Statement trong IF phải là True. 
Không còn Set statement cho Object 
Trong VB6 ta có thể viết: 
Set x = New Product 
Set w = x 
Trong VB.NET sẽ được viết lại như sau: 
x = New Product() 
w = x 
Bây giờ ta không cần phải nhớ dùng chữ Set khi nói đến Object. 
Thay đổi trong cách viết Property routines 
Dùng một Property duy nhất 
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 Integer) 
 _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 
Delegate 
Delegate là một cách giúp ta pass một procedure như một parameter vào trong một method. Ý 
niệm nầy được gọi là Function Pointer hay Callback. Một trường hợp cổ điển ta dùng Delegate 
là cung cấp một dataArray để sort với một Function để so sánh mỗi hai items trong array.Trong 
VB.NET ta dùng AddressOf operator để pass một procedure. Ta declare một Delegate bằng 
cách nói nó là một procedure dưới dạng nào, có bao nhiêu parameters, mỗi parameter thuộc loại 
data type nào. Thí dụ: 
Delegate Function IsGreater (ByVal v1 As Integer, ByVal v2 As Integer) as Boolean 
Khi viết code ta cứ yên tâm sẽ được cung cấp một Function có dạng ấy và đại khái code như 
sau: 
Public Sub DoSort (ByRef DataArray() As Integer, Greater As IsGreater) 
 Dim outer As Integer 
 Dim inner As Integer 
 Dim temp As Integer 
 For outer = 0 To UBound(DataArray) 
 For inner = outer + 1 To UBound(DataArray) 
 If GreaterThan.Invoke( DataArray(outer), DataArray(inner)) Then 
 temp = DataArray(outer) 
 DataArray(outer) = DataArray(inner) 
 DataArray(inner) = temp 
 End If 
 Next 
 Next 
End Sub 
Để ý cách dùng Method Invoke để gọi một Delegate. Bây giờ ta chỉ cần cung cấp Delegate 
routine mà ta đã hứa: 
Public Function myIsGreater (ByVal v1 As Integer, ByVal v2 As Integer) as Boolean 
 Return ( v1 > v2) 
End Function 
Tiếp theo đây là cách ta dùng Delegate nói trên: 
Dim myData() As Integer = { 2, 5, 8, 13, 26} 
DoSort (myData, AddressOf myIsGreater) 
Khi một Subscriber registers với một Publisher một routine để Handle một loại Event, ta cũng 
dùng delegate như sau: 
AddHandler Button4.Click, AddressOf Button4_Click 
Khi một Event Click xãy ra ở Button4, system sẽ execute Sub Button4_Click. 

File đính kèm:

  • pdfLập trình VB.NET - Bài 3.pdf
Tài liệu liên quan