2013-09-27 98 views
7

tôi không thể tìm ra nếu điều này là một lỗi hoặc một tính năngbiến khai báo bên trong một vòng lặp duy trì giá trị thông qua mỗi lần lặp của vòng lặp

For i = 0 To 4 
    Dim strTest As String 
    If i = 0 Then 
     strTest = "test value" 
    End If 
    Console.WriteLine(strTest) 
Next 

Tôi nghĩ rằng bằng cách tuyên bố chuỗi bên trong vòng lặp, nó wouldn 't duy trì giá trị của nó nhưng sau khi chạy mã này giao diện điều khiển có 5 dòng "giá trị thử nghiệm". Nếu thay vào đó, tôi tuyên bố strTest như:

Dim strTest As String= "" 

Sau đó, chuỗi không duy trì giá trị - đó là cách tôi dự kiến ​​hoạt động sẽ hoạt động ngay từ đầu.

Hành vi có chủ ý này của trình biên dịch?

Trả lời

6

"hỏng như thiết kế"

http://msdn.microsoft.com/en-us/library/1t0wsc67.aspx

Note Thậm chí nếu phạm vi của một biến được giới hạn trong một khối, đời của nó vẫn còn là của toàn bộ thủ tục. Nếu bạn nhập khối nhiều lần trong quy trình, mỗi biến khối vẫn giữ giá trị trước đó là . Để tránh các kết quả không mong muốn trong trường hợp này, nó là khôn ngoan để khởi tạo các biến khối ở đầu khối.

"khối" ở đây là phần thân nếu vòng lặp FOR và bạn đang nhập nó một lần. lặp lại vòng lặp. Và vì vậy strTest sẽ giữ lại giá trị được đặt trong lần lặp đầu tiên ("giá trị thử nghiệm") cho các lần lặp tiếp theo (1, 2, 3, 4).

+0

Nếu bạn cảm thấy rằng đây là hành vi bất ngờ, tôi hoàn toàn đồng ý, nhưng người ta có thể cho rằng đó là một cơ hội để vi tối ưu hóa cho hiệu suất. Câu lệnh DIM thực sự chỉ phân bổ bộ nhớ ở đây, do đó, cho một trình biên dịch đủ tốt, nó thực tế miễn phí (một no-op). Nếu nó ngụ ý một khởi tạo, nó sẽ chi phí ít nhất một op pr. lặp lại. –

4

Hành vi được chỉ định rõ ràng. Từ phần 10.9 của số VB 11 specification:

Mỗi lần một vòng lặp được nhập, bản sao mới được tạo từ tất cả các biến cục bộ được khai báo trong giá trị trước đó của biến. Bất kỳ tham chiếu nào đến một biến trong cơ thể vòng lặp sẽ sử dụng bản sao được tạo gần đây nhất.

Lưu ý rằng thực tế rằng đó là "bản sao mới" có khả năng quan trọng nếu bất kỳ biểu thức lambda nào được sử dụng để nắm bắt biến cục bộ. Từ sau trong cùng một phần:

Và khi tạo lambda, nó sẽ ghi nhớ bản sao nào của biến hiện tại tại thời điểm tạo.

(Có một ví dụ mà làm rõ điều đó.)

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