2009-01-26 24 views
31

Có một số mã trong dự án của chúng tôi trông một chút như thế này:Từ khóa Cuộc gọi làm gì trong VB6?

Private Sub Method1() 
    Call InnerMethod 
End Sub 

Private Sub Method2() 
    InnerMethod 
End Sub 

Private Sub InnerMethod() 
    '' stuff 
End Sub 

lợi thế của việc làm Method1 qua Method2 là gì?

Trả lời

35

Từ MSDN:

Bạn không cần phải sử dụng từ khóa Gọi khi gọi một thủ tục. Tuy nhiên, nếu bạn sử dụng từ khóa Gọi để gọi thủ tục yêu cầu đối số, danh sách đối số phải là được đính kèm trong dấu ngoặc đơn. Nếu bạn bỏ qua từ khóa Cuộc gọi, bạn cũng phải bỏ qua dấu ngoặc đơn xung quanh danh sách đối số. Nếu bạn sử dụng Cú pháp cuộc gọi để gọi bất kỳ hàm nội tại hoặc người dùng nào được xác định , giá trị trả lại của hàm sẽ bị hủy.

Ví dụ:

Sub Proc1() 
    Debug.Print "Hello World" 
End Sub 

Sub Proc2(text As String) 
    Debug.Print "Hello " & text 
End Sub 

Trong cửa sổ ngay lập tức, nếu bạn nhập

Proc1 

sau đó "Hello World" in. Nếu bạn nhập

Call Proc1 

thì in "Hello World". Nếu bạn nhập

Proc2 "World" 

thì in "Hello World". Nếu bạn nhập

Call Proc2 "World" 

bạn nhận được lỗi biên dịch. Bạn sẽ phải nhập

Call Proc2("World") 
2

Không có sự khác biệt.

10

Gọi không có gì đặc biệt khác ngoài gọi phương thức. Nó là một treo trên từ những ngày cũ của cơ bản khi tất cả các dòng đã bắt đầu với một từ khóa. "Cho" là một trong những từ khóa này, luôn được đặt trước một bài tập nhưng không còn cần thiết nữa.

Method1 và Method2 cũng thực hiện tương tự.

2

Dưới đây là một số post mô tả thời điểm bạn cần sử dụng cuộc gọi so với không sử dụng cuộc gọi và khi nào cần ngoặc đơn xung quanh thông số của bạn.

Bạn cũng có thể đọc thêm về call từ MSDN. Về cơ bản, sự khác biệt chính là khi bạn sử dụng gọi để gọi hàm, bạn không thể truy cập giá trị trả về.

4

Tôi đã tìm thấy sự khác biệt chính về từ khóa 'cuộc gọi' với các hàm có, Đối số ByRef (Tôi đã tìm thấy điều này trong trình soạn thảo MS-Access VBA). Nếu bạn đang gọi chức năng mà không có từ khóa 'Gọi', thì các ký hiệu ByRef sẽ không được đặt cho calle.Đối với Ví dụ:

Private Function Test(Optional ByRef refArg As String) As Boolean  
    refArg = "Test" 
    Test = True 
End Function 

Nếu bạn gọi hàm mà không có từ khóa Call như

Dim a As String 
Test(a) 

a sẽ là một chuỗi rỗng, sau khi cuộc gọi trả

Nếu bạn gọi hàm với Call từ khóa như

Dim a As String 
Call Test(a) 

a sẽ chứa chuỗi Test

Lời giải thích chi tiết được cung cấp trong liên kết sau: http://blogs.msdn.com/b/ericlippert/archive/2003/09/15/52996.aspx

+5

Hai là không tương đương. Trong trường hợp đầu tiên, kèm theo các đối số trong parens gây ra nó để được đánh giá, và kết quả của việc đánh giá thông qua: trong bản chất, bạn đang đi qua một bản sao của "a", không phải là "a" chính nó. Điều này được thực hiện rõ ràng bởi trình phân tích cú pháp. Khi bạn nhập Test (a) và rời khỏi dòng, trình phân tích cú pháp sẽ thêm một khoảng trắng, làm cho nó kiểm tra (a) để chỉ ra rằng đó là một biểu thức; trong khi với Kiểm tra cuộc gọi (a) không có không gian sẽ được thêm vào - bạn đang chuyển "a" trực tiếp. Xem câu trả lời của Patrick Cuff ở trên để tham khảo tài liệu. –

+0

Thật vậy, và thực sự nhận được kết quả (ví dụ, 'MsgBox Test (a)') khôi phục sự tương đương. – Ant

Các vấn đề liên quan