II.1. 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
Khối lệnh là tập hợp các dịng lệnh được kết thúc bằng End, Else, Loop hoặc Next như trong cấu trúc For … Next, If...Then...Else...End If . Biến khai báo trong khối lệnh cĩ phạm vi sử dụng chỉ
trong khối lệnh
Ví dụ:
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 tồn thủ tục. Đây là trường hợp đặc biệt của phạm vi khối lệnh với khối lệnh là tồn bộ 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 tồ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 tồn project và trong bất kỳ project nào bên ngồ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 khoảng thời gian biến cĩ thể lưu giữ giá trị.
Biến cĩ phạm vi Module cĩ thời gian tồn tại là thời gian ứng dụng đang thực hiện.
Biến cĩ phạm vi khối lệnh, thủ tục chỉ tồn tại trong khi thủ tục đang thực hiện. Biến này sẽ được khởi tạo theo giá trị mặc định của kiểu dữ liệu khi thủ tục bắt đầu thực hiện và chấm dứt khi thủ tục kết thúc.
II.2. 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
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 khai báo
Từ khĩa Ý nghĩa
Public Sử dụng tồ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
II.3. 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ú ý: Kiểu String cũng là kiểu tham chiếu nhưng cĩ một sốđặc tính của kiểu trị. Chúng ta xét đoạn lệnh sau:
Dim ch1, ch2 as String ch1 = "Chuỗi 1"
ch2 = "Chuỗi 2"
MsgBox(ch1) ' xuất ra Chuỗi 1
Chúng ta nghĩ rằng ch1 chứa "Chuỗi 2", nhưng ch1 lại chứa "Chuỗi 1". Lý do như sau: khi biến kiểu String đã được tạo ra, giá trị của chúng khơng thể sửa đổi. Sửa đổi trị của biến String là tạo ra một thể
hiện mới chứa nội dung sửa đổi. Do vậy:
Khi gán ch2 = ch1, ch2 trỏđến cùng một chuỗi như ch1
Nhưng khi gán ch2 = "Chuỗi 2" do khơng thể thay đổi giá trị nên ch2 trỏ đến một thể hiện mới khác với ch1
Bảng sau đây cho biết kiểu dữ liệu thuộc kiểu trị hay kiểu tham chiếu:
Phân loại
Value Type Reference Type
Các kiểu dữ liệu số
Kiểu Boolean, Char, Date
Kiểu Structure, ngay cả khi các thành phần trong Structure là kiểu tham chiếu.
Kiểu String
Mảng
Kiểu lớp đối tượng
II.4. Kiểu Enum (Enumeration)
Kiểu Enum là sự liên kết một tập hợp các trị hằng với các tên gợi nhớ. Các trị này mặc nhiên cĩ kiểu Integer và chỉ cĩ thể là kiểu Byte, Short, Long hoặc Integer.
Kiểu Enum chỉđược tạo trong các Class hoặc Module
Cú pháp:
[Public | Protected | Friend | Protected Friend | Private] [ Shadows ] Enum <tên> [ As <Kiểu DL>] <tên thành phần thứ 1> [ = trị hằng 1] <tên thành phần thứ 2> [ = trị hằng 2] ... <tên thành phần thứ 3> [ = trị hằng 3] End Enum Ví dụ:
Public Enum DoTuoi as Integer Nhidong = 0
Thieunien = 1 Thanhnien = 2 Trungnien = 3 End Enum
Khi khơng chỉ ra trị hằng, VB.NET sẽ gán trị cho thành phần đầu tiên là 0 và tăng dần cho các thành phần kế tiếp:
Ví dụ:
Public Enum DoTuoi as Integer Nhidong ' mặc nhiên cĩ trị 0 Thieunien ' mặc nhiên cĩ trị 1 Thanhnien ' mặc nhiên cĩ trị 2 Trungnien ' mặc nhiên cĩ trị 3 End Enum
Nếu chỉ gán trị hằng cho thành phần đầu tiên, các thành phần kế tiếp sẽ nhận giá trị tăng dần: Public Enum DoTuoi as Integer
Nhidong = 100
Thieunien ' mặc nhiên cĩ trị 101 Thanhnien ' mặc nhiên cĩ trị 102 Trungnien ' mặc nhiên cĩ trị 103 End Enum
Sau khi khai báo kiểu Enum, chúng ta cĩ thể khai báo biến kiểu Enum cũng như sử dụng các thành phần của kiểu này thay cho các trị hằng.
Dim a As DoTuoi a =