Hầu như bất kỳ ứng dụng nào cũng cần đến dữ liệu. Dữ liệu từ người dùng nhập vào, dữ liệu được lưu trữ trong ứng dụng và dữ liệu từ các hệ thống khác,… tất cả đều là nguồn thông tin mà ứng dụng cần xử lý với chức năng chính là hỗ trợ tìm kiếm, tính toán, thống kê và ra quyết định.
Để thực hiện các chức năng xử lý dữ liệu, người lập trình cần phải có các công cụ lập trình chuyên dùng. Dữ liệu không đơn giản lưu trên các file văn bản hay file nhị phân với cấu trúc record do người lập trình định nghĩa. Thay vào đó, hầu hết các ứng dụng tổ chức dữ liệu logic dựa trên cấu trúc cơ sở dữ liệu quan hệ và lưu trữ vật lý dữ liệu dựa vào các hệ quản trị cơ sở dữ liệu quan hệ như Access, SQL Server, Oracle, DB2,…
91 trang |
Chia sẻ: tue_kc | Lượt xem: 5086 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Báo cáo thực tập- Tìm hiểu ngôn ngữ lập trình VB.NET, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
PHẦN I: CÁC ĐẶC ĐIỂM DỮ LIỆU 5
CHƯƠNG I: Các kiểu dữ liệu 5
I. Các kiểu dữ liệu và đặc điểm 5
1. Đặc điểm các kiểu dữ liệu trong .Net Platform 5
2. Kiểu String 5
3. Kiểu DateTime 7
4. Kiểu NumBer 8
II. Các kiểu dữ liệu nội tại của VB.NET gồm: 9
III. Biến - T ính chất, Khai báo và khởi tạo 10
1. Tính Chất 10
2. Khai báo v à khởi tạo 12
3. Mảng & Structure 14
a) Mảng 14
b) Structure 16
4. Các Toán Tử 16
CHƯƠNG II: Cấu trúc câu lệnh 18
I. Cấu Trúc Chọn 18
1. If … Then ….Else 18
2. Select …. Case 19
IV. Cấu Trúc Lặp 19
1. For … Next 20
2. For Each… Next 20
3. Do While… Loop 20
4. Do…Loop While 21
5. Do Until….Loop 21
6. Do Loop… Until 21
7. While… End While 21
CHƯƠNG III Thủ tục và hàm Và Sử lý Lỗi 21
I. Thủ Tục Và hàm 21
Thay đổi trong thủ tục và hàm 21
1. Khai báo Option Strict 22
2. Chuỗi có độ dài cố định 23
3. Chỉ Thị #Region… #End Region 23
4. Imports Không gian tên ( Namespase) 23
V. Sử lý Lỗi 24
1. Phân Loại Lỗi 24
2. Sử Lý Lỗi 24
PHẦN II: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG TRONG VB.NET 27
VI. Chưong 4 :Các tính chất 28
I. Tính trừu tượng 28
II. Tính Bao Bọc 28
III. Tính kế thừa 28
IV. Tính đa hình 29
V. Nạp chồng – Overloading 29
VII. Chương IV : Lớp (Class) 29
I. Tạo Một Namespase 30
II. Tạo một lớp kề thừa 30
III. Khai báo phương thức 31
IV. Khai báo thuộc tính 34
VIII. Chương VI: Sự kiện (Event) 36
I. Khai báo sự kiện 36
II. Phát sinh sự kiện 36
III. Kết hợp sự kiện với sử lý. 38
IX. Chương VII Từ khoá Me, MyBase, MyClass 38
I. Me 39
II. MyBase 39
III. MyClass 40
CHƯƠNG VIII Các điều khiển hiện thị 43
I. ComBoBox, ListBox, CheckListBox 43
X. DataGrid 44
1. Các thuộc tính của DataGrid 45
2. Các Phương thức của DataGrid 46
3. Các sự kiện của DataGrid 46
4. DataGridTableStyle và TableStyle 46
5. DatagridColumStyle và DataGridcolumnStyles 47
6. Thiết kế DataGrid 48
PHẦN III TỔNG QUAN VỀ ADO.NET 51
Chương IX: Đôi điều về ADO.NET 51
I. Tổng Quan – ADO.NET 51
XI. Kiến trúc – ADO.NET 52
XII. Các đặc điểm của ADO.NET 54
1. Interoperability – Tương tác giữa nhiều hệ thống khác nhau 54
2. Scalability - Hỗ trợ nhiều người dùng 54
3. Productivity - Mở rộng khả năng làm việc với CSDL 55
4. Performance - Hiệu quả cao trong xử lý dữ liệu 55
XIII. Đối tượng Sử lý dữ liệu 56
1. Dataset 56
2. DataTable 57
3. DataRelation 57
4. Rằng buộc quan hệ 57
5. DataView 58
XIV. Đối tượng thao tác dữ liệu 58
1. Connection 58
2. Command 59
3. DataReader 59
4. DataAdapter 59
Chương X: Một số đối tượng cơ bản trong ADO.NET 60
I. CONNECTION 60
1. Data Provider 61
2. ConnectionString 61
3. Các thuộc tính khác của Connection 63
4. Các phương thức trên Connection 63
5. Minh họa tạo Connection 63
XV. Command 64
1. Tạo Command 64
2. Các thuộc tính của Command 65
3. Parameter 65
4. Các thuộc tính của Parameter 66
5. Tạo Parameter với CreateParameter của Command 66
6. Thực hiện Command 67
XVI. DataReader 68
1. Các thuộc tính của DataReader 68
2. Các phương thức của DataReader 68
XVII. DataAdapter 68
1. Tạo DataAdapter 69
2. Các thuộc tính chính của DataAdapter 70
3. Các chức năng của DataAdapter 70
4. Tạo bộ lệnh cập nhật cho DataAdapter: 72
XVIII. Mô Hình xử lý dữ liệu trên ADO.NET 74
1. Đối tượng BindingContext 74
2. Đối tượng CurrencyManager 75
Chương XI: Mô hình đa tầng 75
I. Mô hình đa tầng (N-tier) 76
XIX. Xây dựng lớp xử lý lưu trữ 76
XX. Lớp xử lý lưu trữ - Các khai báo 76
XXI. Minh hoạ Mô hình đa tầng 76
PHẦN IV: BÁO BIỂU CRYSTAL REPORT 79
I. Giới thiệu Crystal Report 79
II. Tạo báo biểu 80
1. Nguồn dữ liệu cho báo biểu 80
2. Sử dụng Crystal Report Viewer để hiển thị báo biểu 81
3. Nguồn dữ liệu cho báo biểu từ DataSet 82
4. Lọc dữ liệu báo biểu 86
III. Tạo báo biểu 87
PHẦN III CHƯƠNG TRÌNH 89
I. YÊU CẦU BÀI TOÁN 89
II. MÔ HÌNH QUAN HÊ 89
III. FORM HIỂN THỊ 90
PHẦN I: CÁC ĐẶC ĐIỂM DỮ LIỆU
CHƯƠNG I: Các kiểu dữ liệu
Các kiểu dữ liệu và đặc điểm
Đặc điểm các kiểu dữ liệu trong .Net Platform
Các kiểu dữ liệu mặc nhiên phát sinh từ lớp SysTem.Object.
Ngoài các phương thức kế thừa từ lớp SysTem.Oject, các biến kiểu dữ liệu còn có các phương thức và thuộc tính đặc thù.
Các phương thức chung kế thừa từ SysTem.Object
Equals: Hổ trợ việc so sánh giữa hai object.
Finalize: Thực hiện các thao tác xóa bỏ trước khi object được tự động xóa bỏ.
GetHashCode: Phát sinh một số tương ứng với giá trị của object.
GetType: Trả về kiểu của object.
ToString: Tạo ra chuỗi chứa nội dung mô tả một thể hiện của lớp.
Dưới đây là các bảng liệt kê những phương thức và thuộc tính đặc thù của các kiểu dữ liệu. Do các phương thức có nhiều cách sử dụng khác nhau, nên trong các phần nói về phương thức chỉ mô tả công dụng. Cần tham khảo thêm trong MSDN để hiểu rõ cách dùng.
Kiểu String
Thuộc tính
Mô tả
Chars(i)
Trả về ký tự tại vị trí chỉ ra trong biến. Thuộc tính có tính chỉ đọc
Length
Trả về số ký tự trong biến.
Phương thức
Mô tả
Clone
Trả về một tham chiếu của biến.
Compare
Phương thức so sánh hai tham số kiểu String dựa vào thứ tự các ký tự theo ngôn ngữ qui định trong Regional Settings của từng ký tự và trả về:
w-1 khi chuỗi thứ 1 nhỏ hơn chuỗi thứ 2
w0 khi chuỗi thứ 1 bằng chuỗi thứ 1
w1 khi chuỗi thứ 1 lớn hơn chuỗi thứ 2
wNgoài ra có thể có tham số qui định có phân biệt chữ Hoa chữ thường, v.v…
CompareOrdinal
So sánh hai tham số kiểu String dựa theo bảng mã các ký tự của các tham số.
Hàm trả về hiệu của mã tham số thứ nhất và mã tham số thứ hai.
Concat
Nối các tham số lại với nhau và trả về chuỗi nối.
Copy
Tạo một thể hiện mới kiểu String có giá trị như tham số chuỗi truyền vào.
CopyTo
Sao chép một số ký tự chỉ ra từ một vị trí trên biến vào một vị trí chỉ ra trên mảng ký tự với số lượng ký tự truyền vào.
EndsWith
Trả về True/False cho biết các ký tự cuối của biến có khớp với chuỗi chỉ ra không.
Format
Thay thế phần biểu thức định dạng trong chuỗi bằng các các giá trị tương ứng đã được định dạng theo biểu thức.
IndexOf
Trả về vị trí đầu tiên tìm thấy chuỗi hoặc ký tự truyền vào trên biến, ; có thể sử dụng thêm vị trí bắt đầu tìm, trả về vị trí lần tìm thấy thứ mấy.
IndexOfAny
Trả về vị trí tìm thấy đầu tiên trên biến bất kỳ ký tự nào trong mảng ký tự truyền vào; có thể sử dụng thêm vị trí bắt đầu tìm, trả về vị trí lần tìm thấy thứ mấy.
Insert
Chèn vào một giá trị String truyền vào tại vị trí chỉ định trên biến.
Join
Nối các phần tử của mảng String truyền vào thành một chuỗi duy nhất với dấu nối là chuỗi dấu ngăn cách chỉ ra (separator)
LastIndexOf
Trả về vị trí tìm thấy cuối cùng trên biến, chuỗi hoặc ký tự truyền vào; có thể sử dụng thêm vị trí bắt đầu tìm, trả về vị trí lần tìm thấy thứ mấy.
LastIndexOfAny
Trả về vị trí tìm thấy cuối cùng trên biến bất kỳ ký tự nào trong mảng ký tự truyền vào; có thể sử dụng thêm vị trí bắt đầu tìm, trả về vị trí lần tìm thấy thứ mấy.
PadLeft
Nối thêm bên trái ký tự truyền vào với số lần sao cho độ dài tổng cộng bằng độ dài chỉ ra. Nếu độ dài tổng cộng chỉ ra nhỏ hơn độ dài của biến, không ký tự nào được thêm vào.
PadRight
Nối thêm bên phải ký tự truyền vào với số lần sao cho độ dài tổng cộng bằng độ dài chỉ ra. Nếu độ dài tổng cộng chỉ ra nhỏ hơn độ dài của biến, không ký tự nào được thêm vào.
Remove
Xóa bỏ một số ký tự chỉ ra khỏi biến từ vị trí truyền vào.
Replace
Thay thế tất cả ký tự hay chuỗi tìm thấy trên biến bằng ký tự hay chuỗi truyền vào.
Split
Trả về một mảng String với các phần tử chứa các chuỗi con được ngắt ra từ biến tùy theo ký tự ngăn cách truyền vào.
StartsWith
Cho biết trị bắt đầu của biến có khớp với chuỗi truyền vào.
Substring
Trả về một chuỗi con từ biến.
ToLower
Trả về bản sao của biến với các ký tự in thường.
ToUpper
Trả về bản sao của biến với các ký tự in HOA.
Trim
Trả về biến đã loại bỏ tất cả các ký tự từ đầu đến cuối của biến khớp với mảng ký tự truyền vào.
TrimEnd
Trả về biến đã loại bỏ tất cả các ký tự từ vị trí cuối của biến khớp với mảng ký tự truyền vào.
TrimStart
Trả về biến đã loại bỏ tất cả các ký tự từ vị trí đầu của biến khớp với mảng ký tự truyền vào.
Kiểu DateTime
Field
Mô tả
MaxValue
Hiển thị giá trị lớn nhất của kiểu DateTime (chỉ đọc).
MinValue
Hiển thị giá trị nhỏ nhất của kiểu DateTime (chỉ đọc).
Thuộc tính
Mô tả
Date
Trả về giá trị ngày tháng năm của biến.
Day
Trả về giá trị ngày trong tháng của biến.
DayOfWeek
Trả về giá trị ngày trong tuần của biến, với ngày đầu tiên là Chủ nhật có giá trị là 0.
DayOfYear
Trả về giá trị ngày trong năm của biến.
Hour
Trả về giá trị giờ của biến.
Millisecond
Trả về giá trị phần ngàn giây của biến.
Minute
Trả về giá trị phút của biến.
Month
Trả về tháng của biến.
Now
Trả về giá trị ngày giờ hiện hành của hệ thống.
Second
Trả về giá trị giây của biến.
TimeOfDay
Trả về giá trị giờ phút giây của biến.
Today
Trả về ngày hiện hành.
Year
Trả về năm của biến.
Phương thức
Mô tả
AddDays
Thêm số ngày truyền vào cho giá trị của biến.
AddHours
Thêm số giờ truyền vào cho giá trị của biến.
AddMilliseconds
Thêm số phần ngàn giây truyền vào cho giá trị của biến.
AddMinutes
Thêm số phút truyền vào cho giá trị của biến.
AddMonths
Thêm số tháng truyền vào cho giá trị của biến.
AddSeconds
Thêm số giây truyền vào cho giá trị của biến.
AddYears
Thêm số năm truyền vào cho giá trị của biến.
Compare
So sánh hai biến ngày giờ và cho biết biến nào lớn hơn.
CompareTo
So sánh biến với một tham số Object.
DaysInMonth
Cho biết số ngày trong tháng theo tham số tháng, năm truyền vào.
IsLeapYear
Cho biết giá trị năm truyền vào (dạng yyyy) có phải là năm nhuận hay không.
Subtract
Trừ một giá trị thời gian khỏi biến.
ToLongDateString
Chuyển giá trị biến ra định dạng Long Date.
ToLongTimeString
Chuyển giá trị biến ra định dạng Long Time.
ToShortDateString
Chuyển giá trị biến ra định dạng Short Date.
ToShortTimeString
Chuyển giá trị biến ra định dạng Short Time.
ToString
Trả về chuỗi trị của biến theo định dạng truyền vào
Kiểu NumBer
Phần này nói chung cho các kiểu số Byte, Short, Integer, Long, Single, Double, Decimal
Field
Mô tả
MaxValue
Hiển thị giá trị lớn nhất của kiểu (chỉ đọc).
MinValue
Hiển thị giá trị nhỏ nhất của kiểu (chỉ đọc).
Ngoại trừ kiểu String, các kiểu khác khi muốn chuyển sang kiểu chuỗi đều có thể dùng phương thức ToString (kế thừa từ lớp Object) để chuyển đổi và định dạng cùng lúc.
Cú pháp sử dụng:
ToString()
ToString()
Dưới đây là bảng biểu thức định dạng
Biểu thức
Ý nghĩa
Ví dụ
c, C
Định dạng tiền tệ
12345.67 ToString(“C”) hiển thị $ 12,345.67
e, E
Định dạng số khoa học.
12345.67 ToString(“E”) hiển thị 1.234567E+0004
f, F
Định dạng cố định
12345.67 ToString(“F”) hiển thị 12345.67 (với 2 số lẻ)
g, G
Định dạng tổng quát
12345.67 ToString(“G”) hiển thị 12345.67 tùy theo gía trị có thể hiện thị dưới dạng E hoặc F
n, N
Định dạng số
12345.67 ToString(“N”) hiển thị 12,345.67
p, P
Định dạng phần trăm
0.45 ToString(“P”) hiển thị 45 %
x, X
Định dạng Thập lục phân
250 ToString(“X”) hiển thị FA
Ngoài ra chúng ta cũng có thể sử dụng các ký tự sau đây để lập biểu thức định dạng
Ký tự
Ý nghĩa
Kết quả
0
Số không giữ chỗ
123 ToString(“0000”) hiển thị 0123
#
Số bất kỳ giữ chỗ
123 ToString(“####”) hiển thị 123
.
Dấu phần lẻ
123 ToString(“####.00”) hiển thị 123.00
,
Dấu chia cụm ba số
12345 ToString(“#,###”) hiển thị 12,345
%
Dấu phần trăm
0.45 ToString(“# %”) hiển thị 45 %
E+0,E-0,e+0,
e-0
Dấu hiển thị số khoa học
12345678 ToString(“#.#######E+000”) hiển thị 1.2345678E+007
\
Ký tự literal
123456 ToString(“\# #,###”) hiển thị # 123,456
; Ký tự ngăn cách vùng
Ký tự ngăn cách vùng
Với ToString(“dương #,###;âm #,###; số không”)
-123456 hiển thị âm 123,456
0 hiển thị số không
Các kiểu dữ liệu nội tại của VB.NET gồm:
Kiểu VB.Net
Kiểu CLR
System.x
Vùng nhớ
(Byte)
Type
Code
Miền giá trị
Boolean
Boolean
2
3
True hoặc False.
Byte
Byte
1
6
0 đến 255 (không dấu).
Char
Char
2
4
0 đến 65535 (không dấu).
DateTime
DateTime
8
16
0:00:00 ngày 01 tháng Giêng 0001 đến 23:59:59 ngày 31 tháng Mười Hai 9999.
Decimal
Decimal
16
15
0 đến +/-79,228,162,514,264, 337,593,543,950,335 nếu không có số lẻ; 0 đến +/-7.9228162514264337 593543950335 với 28 số lẻ; số nhỏ nhất khác không là +/- 0.0000000000000000000000000001 (+/-1E-28).
Double
Double
8
14
-1.79769313486231570E+308 đến -4.94065645841246544E -324 đối với số âm; 4.94065645841246544E-324 đến 1.79769313486231570E +308 với số dương.
Integer
Int32
4
9
-2,147,483,648 đến 2,147,483,647.
Long
Int64
8
11
-9,223,372,036,854,775,808 đến 9,223,372,036,854,775,807.
Object
Object (Class)
4
Bất kỳ kiểu dữ liệu nào có thể chứa trong biến kiểu Object.
Short
Int16
2
7
-32,768 đến 32,767.
Single
Single
4
13
-3.4028235E+38 đến -1.401298E-45 với số âm; 1.401298E-45 đến 3.4028235E+38 với số dương.
String
String (Class)
8
0 đến khoảng 2 tỷ ký tự Unicode
User-Defined Type
(kế thừa từ ValueType)
Mỗi thành phần của Structure có miền giá trị theo kiểu dữ liệu của thành phần.
Khi khai báo một kiểu dữ liệu cơ bản, không hẳn biến sẽ sử dụng vùng nhớ như yêu cầu lưu trữ. Ví dụ, mảng cần thêm vùng nhớ cho chính bản thân mảng cũng như cho mỗi chiều (dimension). Mỗi biến Object tham chiếu đến một thành phần hoặc một kiểu hỗn hợp sử dụng 4 byte vùng nhớ ngoài số vùng nhớ cần dùng cho kiểu dữ liệu chứa trong nó.
Biến - T ính chất, Khai báo và khởi tạo
Tính Chất
Biến là một thực thể với 6 tính chất sau:
Name: Tên của biến
Address: Địa chỉ vùng nhớ nơi lưu giữ giá trị của biến. Trong chu kỳ trình sống, địa chỉ của biến có thể thay đổi.
Type: Kiểu của biến, còn gọi là kiểu dữ liệu
Value: Giá trị của biến
Scope: Phạm vi sử dụng của biến.
Mỗi biến có một phạm vi sử dụng là phạm vi trong chương trình nơi biến được nhìn nhận đối với câu lệnh.
·Phạm vi khối lệnh và phạm vi thủ tục
Khi biến được khai báo trong một khối lệnh (tập hợp các từ khóa kết thúc bằng End …, Loop, Next), biến có phạm vi sử dụng trong khối lệnh
Ví dụ:
If x 0 then
Dim a as Integer
a = 1/x
End If
MsgBox CStr(a))
Đoạn lệnh trên sẽ gây lỗi tại dòng MsgBox CStr(a)) vì biến a chỉ có phạm vi sử dụng trong khối lệnh If … End If
Khi biến được khai báo trong một thủ tục nhưng không trong một khối lệnh, biến sẽ có phạm vi sử dụng trong toàn thủ tục.
Biến có phạm vi khối lệnh và phạm vi thủ tục là biến cục bộ.
·Phạm vi module và phạm vi project
Có những khác biệt trong phạm vi sử dụng đối với các biến khai báo chung trong Module chuẩn (Standard module) và Lớp (Class module). Trước tiên, chúng ta cần lưu ý rằng bản thân Module chuẩn được khai báo với một trong ba từ khóa sau: Public, Friend và Private (mặc định)
Tùy theo từ khóa mà phạm vi sử dụng của các thành phần trong module bị giới hạn. Ví dụ một biến Public khai báo trong một module Friend sẽ có phạm vi sử dụng Friend
- Truy xuất Private: nếu biến được khai báo trên phần Declaration của module với từ khóa Private sẽ chỉ có phạm vi sử dụng trong module.
- Truy xuất Friend: nếu biến được khai báo trên phần Declaration của module với từ khóa Friend sẽ có phạm vi sử dụng trong toàn project. Các project khác không thể sử dụng biến này.
- Truy xuất Public: nếu biến được khai báo trên phần Declaration của module với từ khóa Public sẽ có phạm vi sử dụng trong toàn project và trong bất kỳ project nào bên ngoài có một tham chiếu (reference) đến project đó.
¤LifeTime: thời gian tồn tại của biến. Trong khi phạm vi sử dụng của biến xác định nơi chốn biến được phép sử dụng, thì thời gian tồn tại của biến xác định khi nào biến được sử dụng.
Khai báo v à khởi tạo
Lệnh khai báo biến là cú pháp kết hợp tên biến và kiểu dữ liệu. Tự thân lệnh này không hàm ý tạo biến. Tuy nhiên, với các biến không phải kiểu đối tượng, lệnh khai báo biến cũng chính là lệnh tạo biến
Cú pháp
Dim x as Integer
Để nhấn mạnh vai trò của hàm tạo (constructor), chúng ta có thể viết:
Dim x as Integer = New Integer()
Khi khai báo nhiều biến trên cùng dòng và không chỉ ra kiểu của biến, biến sẽ lấy kiểu dữ liệu của biến khai báo dữ liệu tường minh tiếp sau đó
Dim x as Integer, a, b, c as Long
Các biến a, b, c đều cùng có kiểu Long
Có thể khai báo và khởi tạo giá trị cho biến cùng lúc:
Dim x as Integer = 100, y as Integer = 200
Trong cách này, phải khai báo tường minh kiểu dữ liệu cho từng biến.
Với các biến kiểu đối tượng, cách khai báo cũng như thế
Dim objA as MyClass
Lệnh trên chưa tạo ra biến đối tượng và sau dòng lệnh, objA vẫn là Nothing
Những cách sau đây sẽ khai báo và tạo biến đối tượng:
Dim objA as New MyClass()
hoặc
Dim objA as MyClass = New MyClass()
hoặc
Dim objA as MyClass
objA = New MyClass()
Các từ khóa để khai báo biến
Từ khóa
Mô tả
Public
Sử dụng toàn cục
Private
Sử dụng cục bộ trong phạm vi khai báo như Dim
Friend
Sử dụng trong phạm vi của project
Protected
Sử dụng trong phạm vi của lớp và các lớp con
Protected Friend
Sử dụng trong phạm vi của Proctected và Friend
Kiểu trị và tham chiếu (Value Type và Reference Type)
Các kiểu được định nghĩa trong Common Type System thuộc ba loại sau:
Kiểu trị (Value Type)
Kiểu tham chiếu (Reference Type)
Kiểu con trỏ (Pointer Type)
VB.Net không có kiểu con trỏ nên chúng ta chỉ xem xét kiểu trị và kiểu tham chiếu.
Khi một biến kiểu trị được khai báo, một vùng nhớ được dành riêng để chứa giá trị thực của biến. Ngược lại, khi một biến kiểu tham chiếu được khai báo, trình biên dịch sẽ tạo đối tượng trên vùng nhớ, nhưng sẽ gán cho biến bốn byte chứa địa chỉ của đối tượng. Tóm lại, biến kiểu trị chứa giá trị của biến còn biến kiểu tham chiếu chỉ đến nơi chứa giá trị.
Sự khác biệt này dẫn đến nhiều hệ quả mà phép gán là một. Để minh họa chúng ta xem Class sau với một thuộc tính:
Ví dụ:
Public Class Nguoi
Public tuoi as Short
End Class
Và kiểu Structure cũng có một thuộc tính:
Structure ConNguoi
Public tuoi as Short
End Structure
Class là kiểu tham chiếu trong khi Structure là kiểu trị.
Hãy xem xét đoạn lệnh sau:
Dim Ng1, Ng2 as Nguoi
Dim CNg1, CNg2 as ConNguoi
Ng1 = New Nguoi()
Ng1.tuoi = 30
Ng2 = Ng1
Ng2.tuoi = 20
Debug.WriteLine(Ng1.tuoi) ' xuất ra 20
Debug.WriteLine(Ng2.tuoi) ' xuất ra 20
CNg1 = New ConNguoi()
CNg1.tuoi = 30
CNg2 = CNg1
CNg2.tuoi = 20
Debug.WriteLine(CNg1.tuoi)' xuất ra 30
Debug.WriteLine(CNg2.tuoi)' xuất ra 20
Khi được gán cho nhau, hai biến tham chiếu Ng1, Ng2 cùng chứa địa chỉ trỏ đến một đối tượng. Vì vậy thay đối giá trị của thuộc tính tuoi trên biến này, thay đổi cũng phản ánh trên biến kia.
Ngược lại, khi được gán cho nhau, biến tham trị sẽ tạo nên một vùng nhớ chứa trị mới, hai biến trị CNg1, CNg2 cùng chứa trị như nhau nhưng trên hai vùng nhớ khác nhau. Do đó, giá trị của thuộc tính tuoi của hai biến được chứa trên hai vùng nhớ và độc lập nhau.
Chú ý