Tôi có F # chương trình sau đây:hành vi khác nhau trên F # mô-đun khởi
open MyModule
printfn "%d" test
Với MyModule phúc:
module MyModule
printfn "foo"
let test =
printfn "bar"
42
này tạo ra kết quả như sau:
foo
bar
42
Khi tôi thay đổi MyModule đến:
module MyModule
printfn "foo"
let test =
// printfn "bar" <-- note the comment!
42
... kết quả là:
42
Tại sao không "foo" được in nữa?
Cảm ơn, sau khi đọc nó một vài lần tôi hiểu nó. Mặc dù hành vi có vẻ quá phức tạp/không nhất quán. Ví dụ: "let test = 1 + 2" không in "foo", trong khi "let test = add 1 2" có thêm "let add a b = a + b" in print "foo". Điều này phù hợp với đặc tả ngôn ngữ nhưng vẫn có vẻ lạ. Có một lý do tại sao initializers tĩnh không chỉ thực hiện trên truy cập đầu tiên vào bất cứ điều gì trong module, không có vấn đề nếu nó là một biểu thức liên tục đơn giản hoặc cái gì khác? – stmax
Tôi đã cập nhật câu trả lời của mình để chứng minh rằng C# hoạt động tương tự. Tôi cho rằng nó có thể là một tối ưu hóa hiệu suất. Vì không thể cho một hằng số phụ thuộc vào các tác dụng phụ, hoặc bất kỳ tính toán nào cho vấn đề đó, không có lý do rõ ràng nào để khởi tạo tĩnh xảy ra trước khi truy cập nó. – Daniel