Condividi tramite


Associazioni do nelle classi (F#)

Un'associazione do in una definizione di classe consente di eseguire azioni quando l'oggetto viene costruito o, per un'associazione do statica, quando il tipo viene utilizzato per la prima volta.

[static] do expression

Note

Un'associazione do viene visualizzata insieme a o dopo le associazioni let ma prima delle definizioni di membro in una definizione di classe. Sebbene la parola chiave do sia facoltativa per le associazioni do a livello di modulo, non è facoltativa per le associazioni do in una definizione di classe.

Per la costruzione di ogni oggetto di qualsiasi tipo specifico, le associazioni do non statiche e le associazioni let non statiche vengono eseguite nell'ordine con cui appaiono nella definizione di classe. In un tipo possono essere presenti più associazioni do. Le associazioni let non statiche e le associazioni do non statiche diventano il corpo del costruttore primario. Il codice nella sezione relativa alle associazioni do non statiche può fare riferimento ai parametri del costruttore primario e a qualsiasi funzione o valore definito nella sezione relativa alle associazioni let.

Le associazioni do non statiche possono accedere ai membri della classe a condizione che la classe disponga di un autoidentificatore definito da una parola chiave as nell'intestazione di classe e che tutti gli utilizzi di tali membri siano qualificati con l'autoidentificatore per la classe.

Poiché le associazioni let inizializzano i campi privati di una classe, cosa spesso necessaria per garantire che i membri si comportino come previsto, le associazioni do vengono in genere inserite dopo le associazioni let, in modo che il codice nell'associazione do possa eseguire eseguito con un oggetto completamente inizializzato. Se il codice tenta di utilizzare un membro prima che l'inizializzazione venga completata, viene generata un'eccezione InvalidOperationException.

Le associazioni do statiche possono fare riferimento a membri o campi statici della classe che le contiene, ma non a membri o campi di istanza. Le associazioni do statiche diventano parte dell'inizializzatore statico per la classe, che viene sempre eseguito prima che la classe venga utilizzata per la prima volta.

Gli attributi vengono ignorati per le associazioni do nei tipi. Se è richiesto un attributo per il codice eseguito in un'associazione do, l'attributo deve essere applicato al costruttore primario.

Nel codice seguente una classe dispone di un'associazione do statica e di un'associazione do non statica. L'oggetto dispone di un costruttore con due parametri, a e b, e nelle associazioni let per la classe sono definiti due campi privati. Sono definite anche due proprietà. Tutti questi elementi sono inclusi nell'ambito nella sezione relativa alle associazioni do non statiche, come illustrato dalla riga su cui vengono stampati tutti i valori.

open System

type MyType(a:int, b:int) as this =
    inherit Object()
    let x = 2*a
    let y = 2*b
    do printfn "Initializing object %d %d %d %d %d %d"
               a b x y (this.Prop1) (this.Prop2)
    static do printfn "Initializing MyType."
    member this.Prop1 = 4*x
    member this.Prop2 = 4*y
    override this.ToString() = System.String.Format("{0} {1}", this.Prop1, this.Prop2)

let obj1 = new MyType(1, 2)

L'output è indicato di seguito.

Initializing MyType.
Initializing object 1 2 2 4 8 16

Vedere anche

Riferimenti

Classi (F#)

Associazioni let nelle classi (F#)

Associazioni do (F#)

Concetti

Membri (F#)

Costruttori (F#)