Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 18 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
18
Dung lượng
264,03 KB
Nội dung
Các tập Microsoft NET 37 Bài Những khác biệt VB.NET với VB6 V B.NET, gọi VB7, chẳng qua C# viết theo lối Visual Basic Nay VB7 hoàn toàn Object Oriented, tức cho ta dùng lại (reuse) classes/forms theo cách thừa kế thật thoải mái, nên khác VB6 nhiều Dầu vậy, VB6 programmers học VB.NET khơng khó Lý VB.NET không cho thêm nhiều từ (reserved words) Nói chung ý niệm VB.NET dễ lĩnh hội, đem áp dụng cách thực tế Đó nhờ Microsoft giữ nguyên tắc dấu làm sẵn (của VB6) rắc rối phía sau sân khấu, để ta tập trung vào việc tìm kiếm giải pháp, thay bận tâm vào cách thức làm việc Chính nguyên tắc giúp Microsoft chiêu mộ triệu VB6 programmers khắp giới VB.NET cống hiến cho VB programmers công cụ hữu hiệu để dùng cho hoàn cảnh, từ database, desktop, distributed, internet real-time hay mobile (pocket PC) Những ưu điểm (features) VB.NET đến từ chức NET Framework Nó mang đến phương tiện lập trình cho mạng cách Object Oriented XML, Remoting, Streaming, Serialisation, Threading v.v Những thứ lạ khơng khó học, ngược lại tiết kiệm nhiều Mặc dầu VB6 ngơn ngữ lập trình trưởng thành hiệu năng, chắn tồn nhiều năm nữa, học thêm VB.NET đầu tư tương đối tốn đảm bảo huê lợi gấp lần hàng thập niên tới Trong ta bàn điểm khác VB6 VB.NET từ quan điểm ngôn ngữ lập trình Trong khác ta bàn chức Đối tượng (Object Oriented) VB.NET Namespaces Namespaces cách đặt tên để giúp đặt Classes ta dùng program cách thứ tự hầu dễ tìm kiếm chúng Tất code Các tập Microsoft NET 38 NET, viết VB.NET, C# hay ngôn ngữ khác, chứa namespace Điểm áp dụng cho code NET system class libraries Chẳng hạn, classes WinForms nằm System.Windows.Forms namespace Và classes dùng cho collections Queue, Stack, Hashtable v.v nằm System.Collections namespace Tất code ta viết program nằm namespaces Trước VB6, nhắc đến Class COM tên CompName ta viết CompName.classname (còn gọi PROGID) , tức dùng dạng namespace Tuy nhiên phương pháp có vài giới hạn: • Địa class bị buộc cứng vào component chứa • Những classes khơng nằm COM component khơng có "namespace" • Cách gọi tên PROGID có bậc thơi, khơng có bậc con, bậc cháu • Tên Component ln ln có hiệu lực khắp computer Namespaces NET khắc phục giới hạn nói VB6 Nhiều assemblies nằm namespace, nghĩa classes tuyên bố components khác có chung namespace Điều áp dụng xuyên qua ngôn ngữ, giúp cho class viết VB.NET nằm namespace với class viết C#, chẳng hạn Hơn nữa, assembly có nhiều namespaces, thông Các tập Microsoft NET 39 thường ta dùng namespace cho tất classes Nhớ assembly NET đại khái tương đương với COM component Tất code NET nằm assemblies By default, tên project dùng làm namespace Nếu bạn right click lên project name NETListbox Solution Explorer program Demo, chọn Properties popup menu, IDE hiển thị Property Pages dialog đây: Bạn thấy Root namespace project NETListbox Bạn thay đổi tên namespace bạn muốn Namespaces phân chia thứ bậc giống Folders File Directory Nó giúp user đặt classes theo nhóm cho sáng dễ đọc Thí dụ bạn viết program cho hảng sản xuất, bạn dùng namespace NhàSảnXuất root level Bên namespace bạn tạo thêm nhánh chương trình như: • NhàSảnXuất.TồnKho • NhàSảnXuất.SảnPhẩm • NhàSảnXuất.KếTốn.ChiPhí • NhàSảnXuất.KếToán.ThuNhập Các tập Microsoft NET 40 Như ta định nghĩa base namespace tên NhàSảnXuất, với namespaces con, cháu bên trong, namespace có chứa classes, modules, enums, structures namespaces khác Mỗi namespace chứa phần code thích hợp cho program nói chung Trong File Directory, ta có hai files dù mang tên nằm hai folders khác Giống vậy, NET ta có hai classes có tên nằm hai namespaces khác Đó ta viết tên class với namespace phân biệt với class khác với tên Local Global Namespaces Khác với COM components với "namespace" chúng áp dụng cho khắp computer, namespaces NET thơng thường Local, có application program thấy mà thơi .NET hổ trợ Global namespace, phải ký tên (digitally signed) đăng ký với NET runtime để chứa global assembly cache Công việc làm namespace Global rắc rối để giảm thiểu trường hợp ta trở tình trạng DLL hell trước Dùng Namespaces Ta dùng namespaces cách nói thẳng (explicitly) với nguyên tên (Direct Addressing) hay hàm ý (implicitly) với Import keyword Nhưng điều tiên ta phải reference assembly chứa namespace mà ta muốn dùng Ta thực việc với Menu command Project | Add References Khi Add References dialog ra, chọn Tab NET cho standard NET components hay Tab Projects cho DLL NET project khác , highlight DLL bạn muốn click Select button, đoạn click OK Các tập Microsoft NET 41 Chẳng hạn ta muốn read write từ stdio (cái console input/output stream) Cái namespace ta cần System.Console Trong cách Direct Addressing ta code sau để viết hàng chữ "Chào giới": System.Console.WriteLine ("Hello world!") Nếu ta dùng Import keyword cách nhét vào câu Imports System.Console đầu code module, ta code gọn hơn: WriteLine ("Hello world!") Dưới số namespaces thông dụng: Namespace Chức Classes điển hình System.IO Đọc/Viết files data FileStream, Path, StreamReader, streams khác StreamWriter System.Drawing Đồ họa Bitmap, Brush, Pen Color, Font, Graphics System.Data Quản lý data DataSet, DataTable, DataRow, SQLConnection, ADOConnection Các tập Microsoft NET 42 System.Collection Tạo quản lý loại collections ArrayList, BitArray, Queue, Stack, HashTable System.Math Tính tố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ể gốc tích) để phân biệt chúng Điển hình ta dùng namespaces liên hệ đến VB6 Microsoft.Visualbasic Thay code: Microsoft.Visualbasic.Left ( InputString,6) ta tuyên bố: Imports VB6= Microsoft.Visualbasic Sau ta code: VB6.Left ( InputString,6) Dùng Namespaces keyword Trong thí dụ program có Root Namespace NhàSảnXuất nói trên, ta muốn đặt namespace TồnKho, ta phải dùng NameSpace keyword code sau: ' Root Namespace NhàSảnXuất Namespace TồnKho Class PhòngLạnh ' Code cho Phòng Lạnh End Class End Namespace Các tập Microsoft NET 43 Bây muốn nói đến class PhòngLạnh bên namespace TồnKho ta code sau: NhàSảnXuất.TồnKho.PhòngLạnh Thay đổi Data Types Tất Object Một thay đổi lớn cho Data Type VB.NET, variables dùng Data Type địa phương Integer, Single, Boolean,.v.v Objects Chúng derived (xuất phát) từ Class tên Object VB.NET Nếu bạn thử dùng Intellisense để xem có Functions/Properties Object loại Integer có, bạn thấy đây: Trong NET, Integer có bốn loại: Byte (8 bits, khơng có dấu, tức từ đến 255), Short (16 bits, có dấu cộng trừ, tức từ -32768 đến 32767), Integer (32 bits, có dấu) Long (64 bits, có dấu) Như Integer tương đương với Long VB6, Long lớn gấp đôi VB6 Floating-Point Division (Chia số nổi) Việc chia số (Single, Double) VB.NET làm theo tiêu chuẩn IEEE Do ta viết code sau: Dim dValueA As Double Dim dValueB As Double dValueA = dValueB = Các tập Microsoft NET 44 Console.WriteLine(dValueA / dValueB) Trong VB6 ta biết gặp Division by Zero error, program viết Output Window chữ Infinity (vô cực) Tương tự vậy, ta viết code: Dim dValueA As Double Dim dValueB As Double dValueA = dValueB = Console.WriteLine(dValueA / dValueB) Kết chữ NaN (Not a Number) hiển thị Output Window Thay Currency Decimal VB.NET dùng Decimal data type với 128 bits để thay Currency data type VB6 Nó biểu diễn số tới 28 digits nằm bên phải dấu chấm thật xác Hể nhiều digits nằm bên phải dấu chấm tầm trị số Decimal nhỏ Char Type VB.NET có Byte lẫn Char data type Byte dùng cho số nhỏ 0-255, chứa ASCII character dạng số Char dùng để chứa Unicode (16 bit) character Char character String String Type Nhìn lướt qua, String VB.NET khơng khác VB6 Nhưng trừ ta muốn tiếp tục dùng Functions InStr, Left, Mid and Right VB6, ta nên xem String object dùng Properties/Functions VB.NET cho tiện Sau ta học thêm String VB.NET riêng Ý niệm fixed-length (có chiều dài định) String VB6 khơng cịn dùng Do ta khơng thể declare: Các tập Microsoft NET 45 Dim myString As String * 25 Object thay Variant Một data types linh động, hiệu nguy hiểm VB6 Variant Một variable thuộc data type Variant chứa gần thứ (trừ fixed-length string), tự động thích nghi bên để chứa trị số Cái giá phải trả cho linh động program chạy chậm dễ có bugs tạo biến đổi từ data loại qua loại khác khơng theo dự tính ta VB.NET thay Variant Object Vì phương diện kỹ thuật tất data types NET Object nên, giống Variant, Object chứa đủ thứ Nói chung, dầu Object giống Variant, NET ta phải nói rõ (explicitly) muốn làm Ta thử xem thí dụ code VB6 sau: Private Sub Button1_Click() Dim X1 As Variant Dim X2 As Variant X1 = "24.7" X2 = 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 hiển thị Immediate Window : 29.7 24.75 Trong VB.NET, ta phải code cho rõ ràng sau để có kết hiển thị Output Window: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Các tập Microsoft NET 46 Dim X1 As Object Dim X2 As Object X1 = "24.7" X2 = 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 cách dùng data types Vì Object chứa thứ gì, ta muốn dùng loại data type hay class nào, ta phải đổi Object thứ 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 instantiated Product, xem Object variable Do muốn dùng Product ta phải nhờ đến CType Từ chuyên môn programming gọi Type Casting Thay đổi cách tuyên bố Variables Tuyên bố nhiều Variables Các tập Microsoft NET 47 Trong VB6 ta Declare nhiều variables hàng như: Dim i, j, k As Integer Kết có k Integer, cịn i j Variant (có thể điều bạn khơng ngờ) Trong VB.NET ba i,j k Integer, hợp lý Tuyên bố trị số khởi đầu Trong VB6, sau declare variable ta thường cho trị số khởi đầu như: Dim X As Integer X = 12 Bây VB.NET ta gọp chung hai statements lại sau: Dim X As Integer = 12 Tuyên bố Constants Khi tuyên bố Constants VB.NET ta phải khai rõ Data type String, Integer, Boolean v.v.: Public Const myConstantString As String = "happy" Public Const maxStudent As Integer = 30 Dim As New Trong VB6 ta khuyên không nên code: Dim X As New Customer VB6 khơng instantiate Object Customer X dùng đến - chuyện nguy hiểm tạo bug mà ta khơng ngờ Trong VB.NET ta n tâm code: Dim X As New Customer() statement nói tạo Object Customer Tuyên bố Variable Scope Block Các tập Microsoft NET 48 Trong thí dụ đây, variable X declared IF THEN END IF block Khi execution khỏi IF block ấy, X bị hủy diệt Do đó, VB.NET than phiền X undefined khơng thấy X bên IF block Luật áp dụng cho Blocks khác 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 = Dim B As Integer = 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 FOR LOOP có lợi gì, ta khơng Declare lần đầu? Thứ Block giới hạn scope (phạm vi hoạt động) variable để khơng đụng chạm dễ gây nên bug, thứ hai trường hợp điển hình ta cần feature FOR LOOP, iteration ta muốn instantiate Object Khi ta cần Declare Object variable, instantiate Object , chứa vào collection chẳng hạn Truy cập Variable/Class/Structure Trong VB.NET ta định giới hạn việc truy cập Variable, Class, Structure v.v cách dùng keywords sau: Loại truy cập Thí dụ Chú thích Public Public Class ClassForEverybody Cho phép đâu dùng Ta dùng Public mức độ Module, Namespace hay File Tức ta dùng Public Sub/Function Các tập Microsoft NET 49 Protected Protected Class ClassForMyHeirs Cho phép classes con, cháu dùng Ta dùng Protected mức độ Class Friend Friend StringForThisProject As String Cho phép code Project dùng Private Private NumberForMeOnly As Integer Cho phép code module, class, hay structure dùng Lưu ý Dim coi tương đương với Private, ta nên dùng Private cho dễ đọc Ngồi ra, nhớ container (Object chứa) Variable/Class/Structure Private dù ta có tun bố Variable/Class/Structure nằm bên container Public ta không thấy từ bên ngồi Thay đổi Array Array index từ Trong VB.NET khơng có Option Base Array có index Khi bạn tuyên bố array như: Dim myArray(10) As Integer Kết array có 11 elements index từ đến 10 UBound array 10 LBound tất arrays VB.NET Tuyên bố Array với trị số khởi đầu Bạn tuyên bố Array với trị số khởi đầu sau: Dim myArray() As Integer = { 1, 5, 8, 16 } ' Note the curly brackets Statement làm hai chuyện: định size array cho elements trị số khởi đầu Để dùng feature này, bạn khơng nói rõ size array, mà program tự tính ReDim Preserve Trong VB.NET bạn tiếp tục dùng Preserve keyword để giữ nguyên trị số elements array bạn ReDim Tuy Các tập Microsoft NET 50 nhiên có giới hạn cho array với dimension - bạn resize dimention cuối (bên phải) , nên hàng code sau hợp lệ: Dim myArray(,) As String ReDim myArray(5, 5) ReDim Preserve myArray(5, 8) Thay đổi User-Defined Type Ý niệm User-Defined Type (UDT) tiện cho ta gom mảnh data liên hệ lại thành data type có cấu trúc Trong VB6 ta dùng sau: Public Type UStudent FullName As String Age As Integer End Type VB.NET giữ y đặc tính UDT thay đổi chữ Type thành Structure: Public Structure UStudent Public FullName As String Public Age As Integer End Structure Lưu ý Structure Members (như FullName , Age ) cần phải Declared với keyword Dim, Public, Private hay Friend, dùng Protected Structure khơng thể Inherit từ Structure khác Sở dĩ, có dùng Private bên Structure có Property, Sub/Function v.v Thay đổi Collections VB6 hổ trợ Collection sau Windows Scripting Host Library cho ta collection kiểu Dictionary VB.NET cho ta thành phần collection hùng hậu Namespace System.Collections Vì Collection công cụ thông dụng hiệu VB.NET nên ta có dành riêng cho collection sau Các tập Microsoft NET 51 Dưới danh sách collections ta dùng thường xuyên: Collection Chức ArrayList Dynamic Array tự động lớn lên elements bỏ vào BitArray Array chứa trị số Boolean (True/False) HashTable Collection chứa cặp key-value data, cho ta dùng làm tự điển Queue Chứa FIFO (First In, First Out) structure Element Object loại Stack Chứa LIFO (Last In, First Out) structure SortedList Chứa danh sách cặp key-value data theo thứ tự Arithmetic Operators VB.NET cho ta thêm cách viết Arithmetic Operator mà C programmers thích từ lâu X += tương đương với X = X + Mess &= " text" tương đương với Mess = Mess & " text" Arithmetic Operation Trong VB6 Cách viết tắc Cộng X = X +5 X += Trừ X = X - 10 X -= 10 Nhân X=X*7 X *= Chia X = X / 19 X /= 19 Chia Integer X = X \ 13 X \= 13 Lũy thừa X=X^3 X ^= Ghép Strings X = X & "more text" X &= "more text" Ta tiếp tục dùng cách viết VB6, có thêm cách viết gọn Các tập Microsoft NET 52 Short Circuit IF THEN Statement Trong VB6, ta viết: Dim myInt As Integer myInt = If (myInt 0) And (17 \ myInt < ) Then Thì bị Division by Zero error, phần (myInt 0) False, VB6 tiếp tục tính phần (17 \ myInt < ), tạo error 17 chia cho số Trong vài ngơn ngữ lập trình khác, (myInt 0) False khơng tính thêm nữa, tức nói phần AND False định kết Logical Statement IF phải False Ðặc tính gọi Short-Circuit (đi tắc) Nếu ta dùng code nói VB.NET, cho Division by Zero error giống VB6 Tuy nhiên, ta muốn dùng đặc tính Short-Circuit ta cần thay chữ And AndAlso sau: Dim myInt As Integer myInt = If (myInt 0) AndAlso (17 \ myInt < ) Then Short-Circuit áp dụng cho Logical OR ta thay chữ Or OrElse để nói phần đầu OR True định kết Logical Statement IF phải True Khơng cịn Set statement cho Object Trong VB6 ta viết: Set x = New Product Set w = x Trong VB.NET viết lại sau: Các tập Microsoft NET 53 x = New Product() w=x Bây ta không cần phải nhớ dùng chữ Set nói đến Object Thay đổi cách viết Property routines Dùng Property Nếu 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 Get đuợc hợp lại Property routine 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 nói trên) 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 WriteOnly property Bây Property ReadOnly ta viết: Các tập Microsoft NET 54 Public ReadOnly Property Age() As Integer Get Age = End Get End Property hay WriteOnly ta 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 Default Property sau: Default Public Property Item(ByVal Index As Integer) As String VB.NET bắt buộc ta phải parameter cho Default Property Dùng Reserved Word làm Procedure Name Trong VB.NET ta dùng Reserved Word làm Procedure Name cách để ngoặc vng Giả tỉ ta muốn dùng chữ Compare làm tên Function, ta viết 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ụ toán chia đây, bị Division by error ta cho kết Dù có error hay không, program hiển thị kết Output Window qua statement Console.WriteLine( result) phần Finally: ... Arithmetic Operation Trong VB6 Cách viết tắc Cộng X = X +5 X += Trừ X = X - 10 X -= 10 Nhân X=X*7 X *= Chia X = X / 19 X /= 19 Chia Integer X = X \ 13 X \= 13 Lũy thừa X=X ^3 X ^= Ghép Strings X = X... Dictionary VB.NET cho ta thành phần collection hùng hậu Namespace System.Collections Vì Collection công cụ thông dụng hiệu VB.NET nên ta có dành riêng cho collection sau Các tập Microsoft NET 51 Dưới... từ Trong VB.NET khơng có Option Base Array có index Khi bạn tuyên bố array như: Dim myArray (10 ) As Integer Kết array có 11 elements index từ đến 10 UBound array 10 LBound tất arrays VB.NET Tuyên