Compartir a través de


Enlaces do en clases

Un enlace do de una definición de clase realiza acciones cuando se construye el objeto o, para un enlace do estático, cuando se usa el tipo por primera vez.

Sintaxis

[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 es opcional para los enlaces do de una definición de clase.

Para la construcción de cada objeto de cualquier tipo determinado, los enlaces do no estáticos y los enlaces let no estáticos se ejecutan en el orden en que aparecen en la definición de clase. Se pueden producir varios enlaces do en un tipo. Los enlaces let no estáticos y los enlaces do no estáticos se convierten en el cuerpo del constructor principal. El código de la sección enlaces do no estáticos puede hacer referencia a los parámetros del constructor principal y a los valores o funciones que se definen en la sección de enlaces let.

Los enlaces do no estáticos pueden tener acceso a los miembros de la clase siempre y cuando la clase tenga un identificador propio definido por una palabra clave as en el encabezado de clase y, siempre y cuando todos los usos de esos miembros estén calificados con el identificador propio de la clase.

Dado que los enlaces let inicializan los campos privados de una clase, que a menudo es necesario para garantizar que los miembros se comporten según lo previsto, los enlaces do suelen colocarse después de los enlaces let para que el código del enlace do pueda ejecutarse con un objeto completamente inicializado. Si el código intenta usar un miembro antes de que se complete la inicialización, se genera una excepción InvalidOperationException.

Los enlaces do estáticos pueden hacer referencia a campos o miembros estáticos de la clase envolvente, pero no a miembros o campos de instancia. Los enlaces do estáticos forman parte del inicializador estático de la clase, que se garantiza que se ejecute antes de usar el tipo por primera vez.

Los atributos se omiten para los enlaces do en tipos. Si se requiere un atributo para el código que se ejecuta en un enlace do, se debe aplicar al constructor principal.

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 que tiene dos parámetros, a y b, y dos campos privados se definen en los enlaces let de la clase. También se definen dos propiedades. Todos ellos están en el ámbito de la sección enlaces do no estáticos, como se muestra en la línea que imprime todos 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

Consulte también