Liaisons do dans les classes

Une liaison do dans une définition de classe effectue des actions lorsque l’objet est construit ou, pour une liaison do statique, lorsque le type est utilisé pour la première fois.

Syntaxe

[static] do expression

Notes

Une liaison do apparaît avec ou après les liaisons let, mais avant les définitions de membres dans une définition de classe. Bien que le mot clé do soit facultatif pour les liaisons do au niveau du module, il est obligatoire pour les liaisons do dans une définition de classe.

Pour la construction de chaque objet d’un type donné, les liaisons non statiques do et les liaisons non statiques let sont exécutées dans l’ordre dans lequel elles apparaissent dans la définition de classe. Plusieurs liaisons do peuvent se produire dans un type. Les liaisons non statiques let et les liaisons non statiques do deviennent le corps du constructeur principal. Le code de la section des liaisons non statiques do peut référencer les paramètres du constructeur principal et toutes les valeurs ou fonctions définies dans la section des liaisons let.

Les liaisons non statiques do peuvent accéder aux membres de la classe tant que cette dernière a un auto-identificateur défini par un mot clé as dans le titre de classe, et tant que toutes les utilisations de ces membres sont qualifiées avec l’auto-identificateur de la classe.

Étant donné que les liaisons let initialisent les champs privés d’une classe, ce qui est souvent nécessaire pour garantir que les membres se comportent comme prévu, les liaisons do sont généralement placées après les liaisons let afin que le code de la liaison do puisse s’exécuter avec un objet entièrement initialisé. Si votre code tente d’utiliser un membre avant la fin de l’initialisation, une exception InvalidOperationException est déclenchée.

Les liaisons statiques do peuvent référencer des membres ou des champs statiques de la classe englobante, mais pas des membres ou des champs d’instance. Les liaisons statiques do font partie de l’initialiseur statique de la classe, qui est assuré de s’exécuter avant la première utilisation de la classe.

Les attributs sont ignorés pour les liaisons do dans les types. Si un attribut est requis pour le code qui s’exécute dans une liaison do, il doit être appliqué au constructeur principal.

Dans le code suivant, une classe a une liaison statique do et une liaison non statique do. L’objet a un constructeur disposant de deux paramètres, a et b, et deux champs privés sont définis dans les liaisons let de la classe. Deux propriétés sont également définies. Tous ces éléments sont compris dans l’étendue de la section des liaisons non statiques do, comme l’illustre la ligne qui imprime toutes ces valeurs.

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)

La sortie est la suivante.

Initializing MyType.
Initializing object 1 2 2 4 8 16

Voir aussi