Ho il seguente programma F #:comportamento differente su F inizializzazione # modulo
open MyModule
printfn "%d" test
Con MyModule essere:
module MyModule
printfn "foo"
let test =
printfn "bar"
42
Questo produce il seguente output:
foo
bar
42
Quando cambio MyModule a:
module MyModule
printfn "foo"
let test =
// printfn "bar" <-- note the comment!
42
... il risultato è:
42
Perché non "pippo" Get più stampato?
Grazie, dopo averlo letto alcune volte capisco. Anche se il comportamento sembra troppo complicato/incoerente. Ad esempio "let test = 1 + 2" non stampa "pippo", mentre "let test = aggiungi 1 2" con l'aggiunta di "lascia aggiungere b = a + b" stampa "pippo". Questo è conforme alle specifiche del linguaggio, ma sembra ancora strano. C'è un motivo per cui gli inizializzatori statici non vengono solo eseguiti al primo accesso a qualsiasi cosa all'interno del modulo, non importa se si tratta di una semplice espressione costante o qualcos'altro? – stmax
Ho aggiornato la mia risposta per dimostrare che C# si comporta in modo simile. Suppongo che potrebbe essere un ottimizzazione delle prestazioni. Poiché è impossibile che una costante dipenda dagli effetti collaterali o da qualsiasi calcolo, non c'è alcun motivo apparente per l'inizializzazione statica prima dell'accesso. – Daniel