2016-02-05 5 views
6

Voglio usare le espressioni di calcolo all'interno dell'implementazione di una classe F # intesa per il consumo di C#. La classe di interoperabilità stessa è un singleton (un'istanza cablata nel contenitore) e viene utilizzata attraverso i thread (richieste Web).L'utilizzo contemporaneo della stessa istanza di una classe di builder causa effetti collaterali?

Il builder in sé consiste solo di metodi e non ha campi di supporto o stato.

dato che la segue è consuetudine in F #:

module A = 
    let private build = new SomeBuilder() 

Questo significa che le espressioni multiple associate a un costruttore possono essere valutati contemporaneamente senza problemi?

+1

beh ci sono poche informazioni per confermare questo o no - di solito le operazioni nel Builder sono pure (o pure abbastanza) per non fare mai la differenza (si dichiara quasi sempre un'istanza statica del Builder) - ma ovviamente puoi rovinare il grande – Carsten

+0

@Carsten Posso confermare che i metodi sono stati implementati per essere puri, ma non posso confermare che il costruttore esegua queste operazioni in modo puro (dal momento che il costruttore lavora sotto il cofano è opaco per me) . – moarboilerplate

risposta

6

Sotto il cofano, il costruttore non "funziona" affatto. Il compilatore converte semplicemente l'espressione di calcolo in una serie di chiamate di metodo sul builder e quindi lo compila.

Pertanto, la sicurezza del thread del builder dipende interamente dalla sicurezza dei thread dei suoi metodi, vale a dire i metodi che si scrivono.

Ad esempio, il codice seguente:

myBuilder { 
    let! x = f() 
    let! y = g(x) 
    return x + y 
} 

sarebbe convertito nel seguente:

myBuilder.Bind(f(), fun x -> 
    myBuilder.Bind(g(x), fun y -> 
    myBuilder.Return(x + y))) 

(Nota: il codice di cui sopra potrebbe non essere esatti, ma trasmette l'essenza)

5

Un builder puro e senza stato è sicuro per l'uso simultaneo.

Le espressioni di calcolo sono fondamentalmente zucchero di sintassi. Non c'è alcuna differenza effettiva tra l'utilizzo di espressioni di calcolo di un costruttore o la chiamata diretta dei suoi metodi.