không còn hỗ trợ Currentcy Thay bằng Double hay Variant Thay bằng object Fixed lenght String EQU IMP Doevents System.Windows.Forms.Application.Doevents Empty IsMissing Mid … 2.Các
Trang 1Tổng kết( Tóm lược ) về VB.NET
Cập nhật ngày 08/07/2006 ( xin đọc từ đầu )
I Đặc trưng NET
1 Ưu điểm :
- Phát triển ứng dụng nhanh, dễ dàng bảo trì & phát triển
- Chạy ổn định ít bị BUG, CRASH
- Thích hợp cho phát triển wed và các ứng dụng chủ khách nhiều tầng cũng như CSDL
- Dễ dang cài đặt không còn bị DLL Hell
2.Nhược điểm
- Đòi cấu hình mạnh ( CPU : > 1000MHZ, RAM >= 256 MB )
- Dễ bị dịch ngược và crack vì tất cả đều là mã mở do phải dich sang ngôn ngữ trung gian IL
Công cụ:
- Dịch ra IL
C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\ILDASM.exe
- Dịch từ IL về c# & VB.NET
http://www.saurik.com/net/exemplar/
http://www.aisto.com/roeder/dotnet
- Dịch trực tiếp ra mã máy native code :
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ngen.exe
3 Các thuật ngữ mới trong NET
IL : Intermediate Language : Ngôn ngữ trung gian tựa mã máy được sinh ra trong quá trìng chạy
.NET EXE FILE
Assembly : Được hiểu như là một thành phần COMPONENT trên VB, NET được cấu thành từ gần 5000 ASSEMBLY
MetaData : Được hiểu như là các mẫu dữ liệu chứa thông tin về các dữ liệu của chương trình ví dụ như
version, format, type… ( DATA about DATA ), giao diện địng nghĩa dữ liệu
CRL : Common Language Runtime : Là hệ thống máy ảo tựa JAVA để dịch source ra IL Điểm mạnh của .NET là hỗ trợ đa ngôn ngữ do dùng một giao diện chung cho một kiểu dữ liệu như : SYSTEM.OBJECT & SYSTEM.INT32, ngoài ra CLR còn dùng các metadata để chuyển đổi, kiêm tra và thi hành các code
JIT : Just in time Complier, trình thông dịch ra mã máy từ IL code lúc chạy, chỉ có đoạn mã cần chạy là được dịch
Thông tin :
Để tương thích với các ngôn ngữ khác chỉ lên dùng các kiểu dữ liệu chuẩn của CLR như Integer , Long các kiểu như Ulong ,Uinteger xuất hiện từ VB2K5 không phải là kiểu chuẩn do vậy sẽ gặp khó khăn Khi chuyển đổi sang ngôn ngữ khác cũng như tương tác với API
Quá trình thực thị NET:
.NET Executable File ( MetaData + IL Code )
Trang 2Hệ thống máy ảo CLR
Class Loaders
JIT
§
II NET cơ bản
1.Các kiểu dữ liệu ,từ khoá không còn hỗ trợ
Currentcy Thay bằng Double hay
Variant Thay bằng object
Fixed lenght String
EQU
IMP
Doevents System.Windows.Forms.Application.Doevents
Empty
IsMissing
Mid
…
2.Các kiểu dữ liệu mới( hay có thay đổi) VB 6.0
Thông tin : Kiểu Char có kích cỡ 1 byte kí hiệu = “c” nhanh gọn hơn nhiều so với string
String
Thông Tin : Kiểu chuỗi trong NET là kiểu con trỏ , không hỗ trợ chuỗi có độ dài cố định, và được tương tác như một mảng ký tự, có thể truy cập dễ dàng thông qua chỉ số như PASCAL
( các số không dấu thêm U đằng trước- unsigned )
NulAble
Thông Tin : Kiểu dữ liệu cho phếp NULL ( không chứa giá trị nào ), áp dụng trong nhiều trường hợp :
- Kiểu boolean chỉ có hai giá trị T & F nhưng chưa đủ cho nhiều trường hợp ví dụ checkbox có thể T hay F và Disable
-Các khai báo biến optional cần phải gán trước 1 giá trị ngầm định, nhưng trong trường hợp cả giá trị ngầm định cũng bị sử dụng thì phải dùng NullAble
Eg:
Dim X As Nullable(Of Boolean) X.HasValue ( = TRUE có giá trị , = FALSE : NULL) Đọc giá trị qua : X.Value
*!!!! :
Trang 3Các kiểu dữ liệu cơ bản như long ,Int,byte,Short khi khai báo có thể không cần dùng NEW do vậy
Các lệnh sau tương đương :
Dim X As Long Dim X As New Long Dim X As Long = New Long
3 Các từ khoá,cấu trúc , lệnh mới hay có thay đổi VB 6.0
Thông Tin :
STRUCTURE có cấu trúc gần giống CLASS chỉ không kế thừa được Trong có thể gồm cả EVENT, Property, SUB, function.Do vậy structure trong NET rất linh động
Eg:
Public Structure POINTAPI Public X As Integer
Public Y As Integer
Event DrawAction()
End Structure
Tương tự OR nhưng nếu 1 toán hạng trả về kết quả đã quyết định toàn bộ biểu thức thì không cần tính tiếp các toán hạng sau nữa
Tương tự AND nhưng nếu 1 toán hạng trả về kết quả đã quyết định toàn bộ biểu thức thì không cần tính tiếp nữa
Optional
Các tham số khai báo optional phải luôn được gán giá trị khởi tạo Phép chia lấy phần dư ( MOD) với số thực
math.IEEERemainder( 11.2,4.2)
isnot Is ( Not )
+ các hàm chuyển đôi kiểu :
Directcast : Dùng đỏi 2 đối tượng cùng kiểu, 2 đối tượng có thể đổi cho nhau như string long nhưng khác kiểu sẽ bị báo lỗi
Ctype : Đổi hai đối tượng khác loại nhưng có thể đổi được , không đổi được lỗi
Ví dụ : CType(“123”, string ) Báo lỗi : CType (“123SSSA”,long)
Thông tin : Thực chất Ctype chuyển giá trị cần đổi sang một kiểu trung gian ( string) rồi convert về kiểu đich
Trycast : Tương tự DirectCast nhưng trả về nothing nếu có lỗi
+ gettype : Trả về kiểu của đối tượng
+ TypeOf + Is
+ Mảng ( array ) và chuỗi ( String ) được tham chiếu chứ không phải tham trị
Khai báo mảng rỗng :
Dim X(-1) as long Chỉ số đầu của mảng luôn bằng 0
+ Các cấu trúc lặp mới :
Trang 4While < Condition>
End While VB.NET hỗ trợ các lệnh để tiếp tục hay ngắt lặp không cần dùng GOTO như VB 6 Continue : Tiếp tục vòng lặp gần nhất
Exit : Thoát lặp gần nhất
+ Cấu trúc bẫy lỗi :
Try Catch ex As Exception
End Try Thông tin : các thủ tục có dùng cấu trúc bẫy lỗi chạy chậm hơn 40% so với các thủ tục không
có bẫy lỗi, hạn chế dùng trong timer và nên trả về mã lỗi hay kiểm tra điều kiện lỗi = If Then Không lên dùng lẫn cả cấu trúc bẫy lỗi cũ của VB 6
Ví dụ:
Hàm Function kiemtra( ByVal So1 As Long , ByVal so2 As Long ) As Long
Try
Catch ex As Exception MsgBox( " chia cho 0" )
End Function
sẽ chạy chậm hơn nhiều so với hàm dưới do cứ sau 1 lệnh , vb lại phải thêm 1 lệnh kiểm tra lỗi
Function kiemtra2( ByVal So1 As Long , ByVal so2 As Long ) As Long
If (So1 = 0) Or (so2 = 0) Then
MsgBox( "chia cho 0" ) End If
Return So1 / so2 End Function
+ Các cấu trúc Giải phóng bộ nhớ
Using x As New AnyObject
End Using
Có thể dùng kép :
Eg :
Using sr As New StreamReader(inFile), sw As New &_ StreamWriter(outFile),
& _ sw.Write(sr.ReadToEnd().ToLower()) End Using
Thông tin:
Khi dùng Using & End Using , đối tượng sẽ được giải phóng tức thì chứ không phải đợi GC
+ Hỗ trợ DOCK & ANCHo
Hai thuộc tính mới trong control cho phép các điều khiển tự co dãn hay giữ nguyên vị so với các container của nó tiết kiệm công sức
4 Các cú pháp mới
+ Khai báo biến thuận tiện hơn
Eg: Dim X,y,z as long Dim X as long : Dim y as long …
+ Biến được khởi gán :
Eg:
Dim X as long =1 Dim Y(3) as long = {1,2,3}
+
Trang 5X +=1 X = X+1
X - =1 X = X -1 X*= 1 X = X * 1
>> Dịch bít phải có dấu
<< Dịch bít trái có dấu
5.Các ký hiệu đại diện cho kiểu dữ liệu :
Trong khai báo biến
Dim X + “ Ký tự đại diện “
Eg : Dim X% Dim X as integer
& Long
! Single
Trong sử dụng hằng số :
Eg :
Dim X# = 123.2D
Eg :
UL : unsigned long
II.Hỗ trợ ngôn ngữ & trình thông dịch CRL
1 Hỗ trợ chèn các chú thích dùng XML
Trước thủ tục cần chú thích : nhấn ’’’ < Enter> Vb sẽ sinh ra như sau
''' <summary>
'''
''' </summary>
''' <param name="Param1"></param>
''' <returns></returns>
''' <remarks></remarks
2 Hỗ trợ sinh mã tự động
Trong của sổ code gõ ? và nhấn TAB để sinh ra 1 số đoạn mã có cấu trúc hay dùng
Eg : Gõ “If” + “?” <TAB>
VB.NET IDE cho phép tạo thêm các snipset để sinh ra các đoạn mã hay dùng theo mẫu cho phép Tương đương VB code assistant
Tăng tốc độ soạn thảo
Phím nóng : Ctrl + B, Ctrl + K
3.Các chỉ thị biên dịch (Attributes)
Là mớ thông tin để cho CRL biết những việc cần hành xử với một hay vài modul, classs lúc runtime Các trình biên dịch trở về trước thường có riêng các chỉ thị biên dịch để tối ưu mã lệnh mà không ai giống ai, từ vb.net 2003, microsoft đã bó các chỉ thị biên dịch này vào các CLASS để dễ dàng mở rộng.Các chỉ thị biên dịch bắt đầu “ < >”
Trang 6Ngoài tác dụng là các chỉ thị biên dịch ,Microsoft đã mở rộng Attributes thành các lớp để mô tả code, tài liệu… Các atrributives này không nằm trong EXEC CODE của chương trình mà ẩn sau các METADATA của các ASSEMBLLY
Muốn dùng các chỉ thị biên dịch cần imports class
Imports System.Runtime.CompilerServices
imports System.ComponentModel
Ví dụ : Với các thủ tục hay hàm chỉ có một đến vài lệnh có thể tối ưu bằng cách bật chỉ thị inline mode cho phép CRL chèn code trực tiếp chứ không cần phát sinh lời gọi hàm CALL nhăm tăng tốc độ thi hành, thông thường khi gọi hàm :
Function Eval( ByVal n1 As Integer , ByVal n2 As Integer ) As Integer
End Function
Ví dụ:
X = eval(22,10) Net sẽ chèn thẳng : X =22 \10 Nếu tắt inline đi chèn thêm dòng dưới vào trước sub, hay fun
<MethodImpl(MethodImplOptions.NoInlining)> _
Function Eval( ByVal n1 As Integer , ByVal n2 As Integer ) As Integer
End Function
‘ Chỉ thị <Flags> làm NET xem Enum dưới như là một BitCode
<Flags()> Enum ValidDataEntry
IntegerNumber = 1
FloatingNumber = 2
CharString = 4
DateTime = 8
End Enum
4.Các công cụ hỗ trợ đi kèm
IDE ( Intergrated Development eviroment ) môi trường tích hợp phát triển của NET cung cấp khá nhiều công cụ hỗ trợ :
Xem IL code được sinh C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\ildasm.exe Dịch thẳng ra native code
c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ngen.exe Xem thông tin PE NET EXE file
C:\Program Files\Microsoft Visual Studio 8\VC\bin\dumpbin.exe
Để tiện hơn khi sử dụng , trong IDE VB.NET vào TOOLS \ EXTENAL TOOLS… chọn ADD NEW Trong command line : paste đường dẫn, trong agrument : chọn $(TargetDir) , sau OK
5.Gỡ rối ( debug & trace ) ( ??? )
Not available yet
III VB.NET nâng cao
A Các đặc trưng hướng đối tượng & ngôn ngữ nâng cao mới
1 Overloading
Cho phép các thủ tục hàm được dùng cùng 1 tên ( khác tham số),do vậy các thủ tục có thể Mềm dẻo hơn
2 Hỗ trợ default property ( bắt buộc phải có tham số)
Default Public Property Addresses( ByVal index As Integer ) As String
3 Các Constructor cho phép Overload đồng thời hỗ trợ nhiều tham số
Trang 74 Share Function & Sub
Các thủ tục hay hàm trong class có thể được đăng ký SHARE để các lớp khác có thể truy xuất
Thông thường để dùng 1 public sub trong class ta khai báo :
Dim X as anyClass X.AnySub
Nếu anySub được khai báo là SHARE ta có thể gọi anySub mà không cần tạo 1 lớp nào
Eg : AnyClass.AnySub
Thông tin :
- Các property được khai báo public & share chạy chậm hơn các private 30%
- Các share Function & sub không thể truy nhập vào các biến public của class
- Thục tế các module chính là các lớp mà các hàm & thủ tục được khai báo là shared + bỏ thừa kế
5.Shared propery
Các Property được khai báo là Shared sẽ được chép lên vùng PUBLIC do đó có thể bị thay đổi bởi các instance của các class , các instance của 1 class có thể dùng các biến share để trao đổi thông tin cho nhau
6 Parital Class ( class bị phân lớp)
Từ khoá này chỉ có từ Vb 2k5 cho phép 1 class có thể được chứa trong 2 hay nhiều file VB
Thông thường VB tự sinh thêm 1 parital class đối với các đối tượng FORM hay control để chứa các lệnh khởi tạo tự sinh để đỡ làm rối mắt programer ( các file nay thường bị ẩn )
7.Operator over loading ( chỉ có từ VB2k5 )
Các từ khoá +,- And… có thể được overloading ( đối với các structure, Class)
8 Hỗ trợ Delegate
Delegate còn gọi là kiểu thủ tục chính là cách gọi 1 thủ tục mà địa chỉ được lưu vào một biến con trỏ chứ không phải tên thủ tục do vậy trong một số trường hợp tạo lên sự linh động và mềm dẻo cho code , ở Vb.NET dùng delegate rất an toàn
Eg : khai báo
Delegate Sub DisplayMessage(ByVal msg As String)
' ta có 1 sub như sau
' Display a string in the Debug window
Sub WriteToDebugWindow(ByVal msgText As String)
Debug.WriteLine(msgText)
End Sub
Dim X as new DisplayMessage( address of WriteToDebugWindow) X.Invoke(" String here")
9 Gán sự kiện cho nhiều đối tượng
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
Handles MyBase.Load
'Đăng ký 2 sự kiện cho tất cả điều khiển trên FORM
For Each ctrl As Control In GetChildControls(Me)
AddHandler ctrl.MouseEnter, AddressOf Control_MouseEnter
AddHandler ctrl.MouseLeave, AddressOf Control_MouseLeave
Next
End Sub
‘Khai bao c ỏc th ủ t ục s ự ki ện
Private Sub Control_MouseEnter(ByVal sender As Object, ByVal e As
EventArgs)
Dim ctrl As Control = DirectCast(sender, Control)
If Not ctrl.Tag Is Nothing Then ToolStripStatusLabel1.Text =
ctrl.Tag.ToString()
Trang 8End Sub Private Sub Control_MouseLeave(ByVal sender As Object, ByVal e As EventArgs)
ToolStripStatusLabel1.Text = ""
End Sub
‘Ham tra ve cac dieu khien thuoc p arent
Function GetChildControls(ByVal parent As Control) As ArrayList Dim result As New ArrayList()
For Each ctrl As Control In parent.Controls result.Add(ctrl)
result.AddRange(GetChildControls(ctrl)) Next
Return result End Function
10 Cho phép nestesed Class ( chồng lớp )
Vb.NET cho phép khai báo định nghĩa 1 hay nhiều class và cả các interface trong class khác, do vậy
tăng khả năng đóng kin( encapsualation)
Class Outer …
Class Inner …
End Class End Class
Để tạo 1 instance Inner ta code:
Dim ClsInner As New outer.Inner Thông tin:
Với VB 6.0 phải khai báo Inner class ở modul khác, sau đó tạo 1 đối tương cls inner trong outer
11 Kế thừa
VB.Net chỉ hỗ trợ kế thừa từ một class thông qua từ khoá INHERITES
,cho phép class con được quyền Overiding các sub, property của class cha Các từ khoá mới :
MyBase : Truy cập vào lớp class cha
MyClass : Truy cập vào class hiện thời, dùng trong trường hợp cần sub hay function nguyên gốc của class ( không phải các sub, f đã bị overriding )
Me : Dùng với tất cả đối tượng,truy cập đối tượng hiện thời
Thông tin :
Từ khoá INHERRITS cho phép kế thừa toàn bộ từ các class cha ( trừ các property được khai báo
NotInheritAble), do vậy nếu chỉ muốn kế thừa 1 số property xác định thì không được
12.Interface
Từ khoá interface chép phép tạo 1 mẫu cho trước có tác dụng tương tự với các lớp được khai báo
MustInherit ( trừ việc không thừa kế được ), interface là 1 kiểu lớp chỉ có tên thủ tục & hàm đuợc thiết
kế trước, muốn sử dụng phải implements sau đó code VB cũng cấp nhiều các Interface có sẵn giúp giảm thời gian thiết kế cho programmer
Đáng lưu ý là interface lại có thể kế thừa từ nhiều interface khác trong khi CLASS chỉ được kế thừa từ một cha
Ví du :
Interface INguoi
Trang 9Sub An()
End Interface
Muốn dùng interface Inguoi ta phải implements nó ví dụ
Class NhacSi
‘ Code Here
End Class
13.Generic ( áp dụng nhiều cho class và structure )
Thực tế một thủ tục có thể chấp nhận tham số nhiều kiểu : chuỗi, currenty, long,… ví dụ : thủ tục
tính toán +,-… trong máy tính điện tử cùng 1 phép cộng phải thao tác với hàng chục kiếu dữ liệu, bình thường ta có thể viết 10 thủ tục cộng để thao tác với 10 kiểu dữ liệu ( đương nhiên ta chỉ cần dùng 1 kiểu số là double có thể thay thế cho cả interger , real nhưng sẽ tăng thời gian thực hiện do VB sẽ chuyễn int về Double dễ gây bug ), cho dù có dùng overload thì cũng mất thời gian, do vậy NET cung cấp kiểu generic cho phép ta chỉ cần dùng 1 thủ tục là đủ giảm thời gian lập trình:
Ví dụ : ta có mẫu
Sub Swaps( Of T)( ByRef So1 As T, ByRef So2 As T) Dim temp As T
temp = So1 So1 = So2 So2 = temp End Sub
Thủ tục swaps trên có thể áp dụng cho mọi kiểu dữ liệu thay vì phải viết hàng chục modul swap : eg : swapInt, SwapDate,SwapLong…
ví dụ :
Thông tin ; Đương nhiên ta có thể dùng kiểu object hay VARIANT của VB6 nhưng như vậy sẽ chậm do kiểu phải qua 1 lần convert ,dễ gây bug , hơn nữa kiểu generic còn được hỗ trợ mạnh khi viết các CLASS năng động chấp nhận rất nhiều loại thông tin đầu vào không chỉ dừng ở các kiểu cơ bản như long, int, string mà còn các kiểu UDT
14 Các thông tin khác
Vb.Net cho phép các UDT, các cấu trúc khác như array cũng được khai báo PUBLIC trong class do vậy làm CLASS linh động hơn rất nhiều
B.Các đối tượng mới trong VB.NET
1 Đối tượng Objects trong NET
Các kiểu dữ liệu trong Net đều khởi phát từ đối tượng này : gồm các thủ tục và hàm chuẩn :
+ Equals : Trả về true nếu giá trị của đối tượng = giá trị đầu vào
+ GetHashCode : Trả về mã ID của đối tượng + ToString : Trả về tên của đối tượng dạng chuỗi + GetType : trả về kiểu dữ liệu
+ ReferenceEquals : Trả về true nếu 2 đối tường đầu vào cùng trỏ đến 1 địa chỉ 2.String
Kiểu chuỗi rất mạnh trong NET có thể thao tác như mảng ký tự trên PASCAL Nếu một chuỗi được dùng lặp lại nhiều lần VB cho phép chỉ lưu 1 bản sao duy nhât của chuỗi các chuỗi tương tự về sau sẽ trỏ đên chính địa chỉ của bản đầu tiên để tăng tốc độ thực thi
Ví dụ :
s1 = "ABCD"
s1 &= "EFGH"
' Chuyển S1 vào bộ đêm trong
Trang 10s1 = String.Intern(s1) ' gán S2 bằng 1 hằng chuỗi đã được cached
s2 = "ABCDEFGH"
' Lúc này cả hai biến có cùng địa chỉ
Console.WriteLine(s1 Is s2) ' => True
3 Array
Kiểu array trên VB được hỗ trợ thêm nhiều chức năng như lọc ,sắp xếp…
4.Regular Expressions
Kiểu đối tượng hoạt động giống với LIKE nhưng linh động hơn và phức tạp hơn rất nhiều,Có thể thay thế nhiều đoạn mã xử lý chuỗi phức tạp chỉ bằng 1 lệnh đơn giản giảm thời gian viết code.Tuy vậy tốc độ xử lý chậm hơn so với LIKE và châm hơn nhiêu so với dùng FOR, hay WHILE để phân tích bù lại có thể dùng để code các trình phân tích cú pháp, chuỗi, tính toán biểu thức chỉ bằng một ít lệnh
Khi sử dụng cần imports
Imports System.Text
Imports System.Text.RegularExpressions
Ví dụ :
pattern = "^\d{5}$"
If Regex.IsMatch(text, pattern) Then ' Là một chuỗi gồm năm chữ số
End If
5 System Watches
Tương tự Timer dùng để đo thời gian thi hành ứng dụng
6 Threads lập trình đa luồng
Not Available yet
7 Serialization
Not Available yet
Danh mục các NameSpaces :
System.CodeDOM
Bao gồm các CLASS xử lý các phần tử và cấu trúc của mã nguồn
System.ComponentModel
Tựa như các hướng dẫn biên dịch lúc thiết kế và lúc chạy cho các điều khiển & các thành phần (COM)
System.Configuration
Hỗ trợ việc tạo các trình cài đặt tuỳ chọn cho thành phần phần mềm
System.Data
Bao gồm các CLASS cấu thành lên kiến trúc ADO.NET sử dụng cho việc kết nối CSDL
System.Diagnostics
Hỗ trợ gỡ rối và dò lỗi
System.DirectoryServices
Truy cập Active directory từ các managed code
System.Drawing
Truy nhập các hàm đồ hoạ gồm các lớp con System.Drawing.Drawing2D, System.Drawing.Imaging, and System.Drawing.Text namespaces
System.Net
Cung cấp các cách thức truy cập mạng như FTP and HTTP
Ngoài ra còn có các cách truy cập bậc thấp như WinSock:
The System.Net.Sockets
System.Reflection