• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Khai báo ByVal và ByRef

Các bài viết hướng dẫn và tham khảo chung, không thuộc ngôn ngữ nào

Moderator: vietluyen

User avatar
truongphu
VIP
VIP
Posts: 4764
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 519 times

Khai báo ByVal và ByRef

Postby truongphu » Sun 10/05/2009 9:23 am

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

Code: Select all

  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)

Code: Select all

  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...)


o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
xuanquy_th
Guru
Guru
Posts: 803
Joined: Tue 05/08/2008 9:15 pm
Location: Thanh Hoá
Has thanked: 1 time
Been thanked: 10 times
Contact:

Re: Khai báo ByVal và ByRef

Postby xuanquy_th » Sun 10/05/2009 10:06 am

Đâ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
Khi Chúa Trời đóng cánh cửa này lại, Ngài sẽ mở một cánh cửa khác cho ta.
Nhưng ta thường nhìn quá lâu vào cánh cửa đã đóng nên không thấy được có một cánh cửa khác đang mở ra cho ta!!!

User avatar
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Posts: 1123
Joined: Wed 24/09/2008 4:04 pm
Location: TPHCM
Has thanked: 1 time
Been thanked: 28 times

Re: Khai báo ByVal và ByRef

Postby tungcan5diop » Sun 10/05/2009 9:57 pm

xuanquy_th wrote:Đâ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
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!

User avatar
hoangthu1974
Guru
Guru
Posts: 813
Joined: Thu 09/03/2006 9:30 am
Location: Hà Nội --> Tp. Hồ Chí Minh
Been thanked: 13 times
Contact:

Re: Khai báo ByVal và ByRef

Postby hoangthu1974 » Mon 11/05/2009 8:27 am

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.


Return to “Bài viết hướng dẫn”

Who is online

Users browsing this forum: No registered users and 0 guests