Trang 1 trên 1

Khai báo ByVal và ByRef

Đã gửi: CN 10/05/2009 9:23 am
gửi bởi truongphu
Tên bài viết: Khai báo ByVal và ByRef
Tác giả: truongphu
Cấp độ bài viết: căn bản quan trọng
Tóm tắt: Ít ai chú tâm đến ý nghĩa của khai báo ByVal...


Trong thủ tục khai báo các biến số của hàm (function) hay thủ tục (sub) ta thấy có lúc các biến được khai báo có kèm từ "ByVal" ở đằng trước. Vậy ByVal là gì? có tác dụng thế nào trong hàm hay thủ tục?

* Mặc định của Visual Basic là ByRef (By References), nghĩa là nếu không khai báo ByVal thì hàm hay thủ tục nhận luôn cả biến để tính toán, và trong quá trình làm việc nầy, nếu giá trị biến thay đổi thì vẫn tiếp tục dùng.
Tóm tắt: Nếu không khai báo ByVal trong các biến (đối số) của một Function hay Sub thì Function hay Sub sẽ sử dụng luôn biến số nầy và chấp nhận các giá trị thay đổi của biến số trong các quá trình tính toán tiếp theo.

* Ngược lại, nếu có khai báo ByVal (By value) thì hàm hay thủ tục chỉ nhận giá trị của biến lúc đó để tính toán, nhờ thế giá trị biến vẫn bảo tồn
Tóm tắt: Nếu có khai báo ByVal với biến số (của đối số) của một Function hay Sub thì Function hay Sub chỉ nhận giá trị tức thời của biến để tính toán, hoàn toàn không tác động thay đổi giá trị của biến trong suốt quá trình làm việc.

* Code minh họa: Biến XX và Function YYY với khai báo ByVal

Mã: Chọn hết

  1. Dim XX As Integer
  2.  
  3. Private Sub Form_Load()
  4.     XX = 10
  5. End Sub
  6.  
  7. Private Sub Command1_Click()
  8.     MsgBox YYY(XX)
  9. End Sub
  10.  
  11. Function YYY(ByVal XX As Integer) As Long
  12.     XX = XX + 1
  13.     YYY = XX * 5
  14. End Function


Trong đoạn code trên, biến toàn cục XX được khởi tạo có giá trị là 10
Khi nhấn Command1 sẽ gọi Function YYY để xử lý biến XX
Lúc nầy, Function YYY Chỉ Nhận Giá Trị của biến XX là 10 và đưa vào tính toán
còn biến XX gạt ra ngoài, không đụng đến
Kết quả, ta nhấn Command1 bao nhiêu lần
vẫn chỉ nhận đáp án là 55
(do biến XX không thay đổi)

* Code minh họa: Biến XX và Function YYY (không khai báo ByVal)

Mã: Chọn hết

  1. Dim XX As Integer
  2.  
  3. Private Sub Form_Load()
  4.     XX = 10
  5. End Sub
  6.  
  7. Private Sub Command1_Click()
  8.     MsgBox YYY(XX)
  9. End Sub
  10.  
  11. Function YYY(XX As Integer) As Long
  12.     XX = XX + 1
  13.     YYY = XX * 5
  14. End Function


Trong đoạn code trên, biến toàn cục XX được khởi tạo có giá trị là 10
Khi nhấn Command1 sẽ gọi Function YYY để xử lý biến XX
Lúc nầy, Function YYY Nhận Luôn Biến XX đưa vào tính toán
và biến XX bị thay đổi theo quá trình làm việc
Kết quả, ta nhấn Command1 nhiều lần
thì đáp án nhận được sẽ thay đổi 55, 60, 65...
(do biến XX đã thay đổi từ 10, 11, 12...)

Re: Khai báo ByVal và ByRef

Đã gửi: CN 10/05/2009 10:06 am
gửi bởi xuanquy_th
Đây chính là điểm yếu của VB6
Và qua vb2005 nó đã được khắc phục

Hồi trước làm VB6 nhiều lúc gặp lổi mà không hiểu tại sao nó lổi!
Sau vài lần Debug với phát hiện ra là VB6 mặc định các biến trong Function và Sub là ByRef
Vấn đề này quả thật là đau đầu với ai lần đầu tiên vướng phải :D

Re: Khai báo ByVal và ByRef

Đã gửi: CN 10/05/2009 9:57 pm
gửi bởi tungcan5diop
xuanquy_th đã viết:Đây chính là điểm yếu của VB6
Và qua vb2005 nó đã được khắc phục

Hồi trước làm VB6 nhiều lúc gặp lổi mà không hiểu tại sao nó lổi!
Sau vài lần Debug với phát hiện ra là VB6 mặc định các biến trong Function và Sub là ByRef
Vấn đề này quả thật là đau đầu với ai lần đầu tiên vướng phải :D

chưa làm vb6 nên nghe xuanquy nói mới hiểu..sang vb.net thì dễ rồi :D

Re: Khai báo ByVal và ByRef

Đã gửi: T.Hai 11/05/2009 8:27 am
gửi bởi hoangthu1974
Thủ tục khai báo tham số truyền cho Sub và Function của VB6 gồm ByVal (Chỉ truyền tham số) và ByRef (Truyền liên kết biến). Mặc định nếu tên biến khai báo không trùng với biến đã được khai báo trong phạm vi hoạt động của Sub hoặc Function là ByVal, còn trùng là ByRef.

Khi dùng ở ByVal, các thay đổi về giá trị của biến sẽ không ảnh hưởng đến biến nguyên gốc truyền vào.
Khi dùng ở ByRef, các thay đổi về giá trị của biến sẽ thay đổi cả giá trị của biến nguyên gốc truyền vào.