Liaisons do dans les classes (F#)
Une liaison do dans une définition de classe exécute des actions lorsque l'objet est construit ou, pour une liaison do statique, lorsque le type est utilisé pour la première fois.
[static] do expression
Notes
Une liaison do apparaît avec ou après les liaisons let, mais avant les définitions de membre 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 do et let non statiques 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 let et do non statiques deviennent le corps du constructeur principal. Le code dans la section des liaisons do non statiques peut référencer les paramètres du constructeur principal et toute valeur ou fonction définie dans la section des liaisons let.
Les liaisons do non statiques peuvent accéder aux membres de la classe tant que la classe a un auto-identificateur défini par un mot clé as dans le titre de la classe, et tant que toutes les utilisations de ces membres sont qualifiées avec l'auto-identificateur pour 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 dans la liaison do puisse s'exécuter avec un objet entièrement initialisé. Si votre code essaie d'utiliser un membre avant que l'initialisation ne soit terminée, une InvalidOperationException est levée.
Des liaisons do statiques 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 do statiques deviennent partie intégrante de l'initialiseur statique pour la classe, dont l'exécution avant la première utilisation de la classe est garantie.
Les attributs sont ignorés pour les liaisons do dans les types. Si un attribut est requis pour du code qui s'exécute dans une liaison do, il doit s'appliquer au constructeur principal.
Dans le code suivant, une classe a une liaison do statique et une liaison do non statique. L'objet a un constructeur avec deux paramètres, a et b, et deux champs privés sont définis dans les liaisons let pour la classe. Deux propriétés sont également définies. Tous ces éléments sont dans la portée de la section des liaisons do non statiques, comme indiqué par 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
Référence
Liaisons let dans les classes (F#)