Enlaces do en clases (F#)
Un enlace do en una definición de clase realiza acciones cuando se construye el objeto o, en el caso de un enlace do estático, cuando se usa el tipo por primera vez.
[static] do expression
Comentarios
Un enlace do aparece junto con (o después de) los enlaces let, pero antes de las definiciones de miembro en una definición de clase. Aunque la palabra clave do es opcional para los enlaces do en el nivel de módulo, no lo es para los enlaces do en una definición de clase.
Para la construcción de un objeto de cualquier tipo, los enlaces do no estáticos y los enlaces let no estáticos se ejecutan según el orden en que aparecen en la definición de clase. Puede haber varios enlaces do en un solo tipo. Los enlaces let no estáticos y los enlaces do no estáticos pasan a ser el cuerpo del constructor primario. El código de la sección de enlaces do no estáticos puede hacer referencia a los parámetros del constructor primario y a los valores y funciones definidos en la sección de enlaces let.
Los enlaces do no estáticos pueden obtener acceso a los miembros de la clase, siempre y cuando la clase tenga un identificador de instancia actual definido por una palabra clave as en el encabezado de clase y todos los usos de esos miembros se califiquen con dicho identificador.
Dado que los enlaces let inicializan los campos privados de una clase, lo que a menudo es necesario para garantizar que los miembros tengan el comportamiento esperado, los enlaces do suelen colocarse después de los enlaces let para que el código en los enlaces do pueda ejecutarse con un objeto totalmente inicializado. Si el código intenta utilizar un miembro antes de que se haya completado la inicialización, se producirá una excepción InvalidOperationException.
Los enlaces do estáticos pueden hacer referencia a los miembros o campos estáticos de la clase envolvente, pero no a los miembros ni a los campos de instancia. Los enlaces do estáticos pasan a formar parte del inicializador estático de la clase, que se ejecuta antes de que se use la clase por primera vez.
Se omiten los atributos para los enlaces do en los tipos. Si se requiere un atributo para código que se ejecuta en un enlace do, debe aplicarse al constructor primario.
En el código siguiente, una clase tiene un enlace do estático y un enlace do no estático. El objeto tiene un constructor con dos parámetros, a y b, y en los enlaces let se definen dos campos privados para la clase. También se definen dos propiedades. Todos estos elementos están dentro del ámbito de la sección de enlaces do no estáticos, tal y como indica la línea que imprime en pantalla esos valores.
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 salida es la siguiente.
Initializing MyType.
Initializing object 1 2 2 4 8 16