Associazioni do nelle classi
Un'associazione do
in una definizione di classe esegue azioni quando l'oggetto viene costruito o, per un'associazione statica do
, quando il tipo viene utilizzato per la prima volta.
Sintassi
[static] do expression
Osservazioni:
Un'associazione do
viene visualizzata insieme o dopo let
le associazioni, ma prima delle definizioni dei membri in una definizione di classe. Sebbene la do
parola chiave sia facoltativa per do
le associazioni a livello di modulo, non è facoltativa per do
le associazioni in una definizione di classe.
Per la costruzione di ogni oggetto di qualsiasi tipo specificato, le associazioni non statiche e le associazioni non statiche do
let
vengono eseguite nell'ordine in cui vengono visualizzate nella definizione della classe. Più do
associazioni possono verificarsi in un solo tipo. Le associazioni non statiche e le associazioni non statiche let
do
diventano il corpo del costruttore primario. Il codice nella sezione associazioni non statiche do
può fare riferimento ai parametri del costruttore primario e a qualsiasi valore o funzione definiti nella let
sezione binding.
Le associazioni non statiche do
possono accedere ai membri della classe purché la classe disponga di un identificatore automatico definito da una as
parola chiave nell'intestazione della classe e, purché tutti gli usi di tali membri siano qualificati con l'identificatore automatico per la classe.
Poiché let
le associazioni inizializzano i campi privati di una classe, spesso necessario per garantire che i membri si comportino come previsto, do
le associazioni vengono in genere inserite dopo let
le associazioni in modo che il codice nell'associazione do
possa essere eseguito con un oggetto completamente inizializzato. Se il codice tenta di usare un membro prima del completamento dell'inizializzazione, viene generata un'eccezione InvalidOperationException.
Le associazioni statiche possono fare riferimento a membri o campi statici do
della classe contenitore, ma non ai membri o ai campi dell'istanza. Le associazioni statiche do
diventano parte dell'inizializzatore statico per la classe , che viene garantita l'esecuzione prima dell'uso della classe.
Gli attributi vengono ignorati per do
le associazioni nei tipi. Se è necessario un attributo per il codice eseguito in un'associazione do
, deve essere applicato al costruttore primario.
Nel codice seguente una classe ha un'associazione statica e un'associazione non statica do
do
. L'oggetto ha un costruttore con due parametri, a
e b
e due campi privati vengono definiti nelle let
associazioni per la classe . Vengono definite anche due proprietà. Tutti questi sono inclusi nell'ambito nella sezione associazioni non statiche do
, come illustrato dalla riga che stampa 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