클래스의 do 바인딩(F#)
클래스 정의의 do 바인딩은 개체가 생성될 때 작업을 수행합니다. 정적 do 바인딩은 형식이 처음 사용될 때 작업을 수행합니다.
[static] do expression
설명
do 바인딩은 let 바인딩과 함께 또는 그 뒤에 사용될 수 있으며 클래스 정의에서 멤버 정의보다 앞에 와야 합니다.do 키워드는 모듈 수준의 do 바인딩에 대해서는 선택 사항이지만 클래스 정의의 do 바인딩에 대해서는 선택 사항이 아닙니다.
주어진 모든 형식의 각 개체를 생성할 때마다 정적이지 않은 do 바인딩과 정적이지 않은 let 바인딩이 클래스 정의에 사용되는 순서대로 실행됩니다.여러 개의 do 바인딩이 한 가지 형식으로 발생할 수 있습니다.정적이지 않은 let 바인딩과 정적이지 않은 do 바인딩은 기본 생성자의 본문이 됩니다.정적이지 않은 do 바인딩 섹션의 코드는 let 바인딩 섹션에 정의되어 있는 임의의 값 또는 함수와 기본 생성자 매개 변수를 참조할 수 있습니다.
as 키워드로 정의한 자체 식별자가 클래스 머리글에 있고 클래스의 멤버를 사용할 때마다 클래스의 자체 식별자로 이를 한정하는 경우에 한해 정적이지 않은 do 바인딩에서 클래스의 멤버에 액세스할 수 있습니다.
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