Поделиться через


Привязки do в классах (F#)

Привязка do в определении класса выполняет действия при построении объекта или (если речь идет о статической привязке do) при первом использовании типа.

[static] do expression

Заметки

В определении класса привязка do отображается вместе с привязками let или сразу после них, но перед определениями членов. Хотя ключевое слово do является необязательным для привязок do на уровне модуля, оно обязательно для привязок do в определении класса.

При создании всех объектов любого заданного типа нестатические привязки do и let выполняются в том порядке, в котором они отображаются в определении класса. В одном типе может существовать несколько привязок do. Нестатические привязки let и do становятся основной частью главного конструктора. Код в разделе нестатических привязок do может содержать ссылки на параметры главного конструктора и любые значения или функции, определенные в разделе привязок let.

Нестатические привязки do могут осуществлять доступ к членам класса при условии, что класс имеет собственный идентификатор, определяемый ключевым словом as в заголовке класса, а все использования этих членов определены для данного класса с помощью данного идентификатора.

Так как привязки let инициализируют закрытые поля класса (часто это необходимо, чтобы обеспечить правильное поведение членов), привязки do, как правило, расположены после привязок let, что позволяет выполнять код в привязке do с полностью инициализированным объектом. Если ваш код пытается использовать член до завершения инициализации, вызывается исключение InvalidOperationException.

Статические привязки do могут ссылаться на статические члены или поля включающего класса, но не на члены или поля экземпляра. Статические привязки do становятся частью статического инициализатора для класса, который непременно будет выполнен до первого использования класса.

В типах атрибуты для привязок do игнорируются. Если атрибут требуется для кода, который выполняется в привязке do, его необходимо применить к главному конструктору.

В следующем примере кода класс имеет статическую привязку do и нестатическую привязку do. Объект включает конструктор, который имеет два параметра (a и b). Два закрытых поля определены в привязках let для данного класса. Также определяются два свойства. Все это входит в раздел нестатических привязок do, как продемонстрировано в следующей строке, в которой встречаются все эти значения.

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)

Выходные данные выглядят следующим образом.

Initializing MyType.
Initializing object 1 2 2 4 8 16

См. также

Ссылки

Классы (F#)

Привязки let в классах (F#)

Привязки do (F#)

Основные понятия

Члены (F#)

Конструкторы (F#)