F # - Delegeler
Temsilci, bir yönteme başvuruyu tutan başvuru türü bir değişkendir. Referans, çalışma zamanında değiştirilebilir. F # delegeleri, C veya C ++ 'da işlevlere işaretçilerle benzerdir.
Temsilci Bildirme
Temsilci bildirimi, temsilci tarafından başvurulabilecek yöntemleri belirler. Temsilci, temsilcinin imzasıyla aynı imzaya sahip bir yönteme başvurabilir.
Temsilci bildirimi için sözdizimi -
type delegate-typename = delegate of type1 -> type2
Örneğin, delegeleri düşünün -
// Delegate1 works with tuple arguments.
type Delegate1 = delegate of (int * int) -> int
// Delegate2 works with curried arguments.
type Delegate2 = delegate of int * int -> int
Her iki temsilci de iki int parametresi olan ve int tipi bir değişken döndüren herhangi bir yönteme başvurmak için kullanılabilir .
Sözdiziminde -
type1 bağımsız değişken türlerini temsil eder.
type2 dönüş türünü temsil eder.
Lütfen aklınızda bulundurun -
Bağımsız değişken türleri otomatik olarak kıvrılır.
Temsilciler, işlev değerlerine ve statik veya örnek yöntemlere eklenebilir.
F # işlev değerleri, yapıcıları temsil etmek için doğrudan bağımsız değişken olarak iletilebilir.
Statik bir yöntem için temsilci, sınıfın adı ve yöntemi kullanılarak çağrılır. Bir örnek yöntemi için, nesne örneğinin ve yönteminin adı kullanılır.
Temsilci türündeki Invoke yöntemi, kapsüllenmiş işlevi çağırır.
Ayrıca, temsilciler, parantezler olmadan Invoke yöntem adına başvurarak işlev değerleri olarak geçirilebilir.
Aşağıdaki örnek kavramı göstermektedir -
Misal
type Myclass() =
static member add(a : int, b : int) =
a + b
static member sub (a : int) (b : int) =
a - b
member x.Add(a : int, b : int) =
a + b
member x.Sub(a : int) (b : int) =
a - b
// Delegate1 works with tuple arguments.
type Delegate1 = delegate of (int * int) -> int
// Delegate2 works with curried arguments.
type Delegate2 = delegate of int * int -> int
let InvokeDelegate1 (dlg : Delegate1) (a : int) (b: int) =
dlg.Invoke(a, b)
let InvokeDelegate2 (dlg : Delegate2) (a : int) (b: int) =
dlg.Invoke(a, b)
// For static methods, use the class name, the dot operator, and the
// name of the static method.
let del1 : Delegate1 = new Delegate1( Myclass.add )
let del2 : Delegate2 = new Delegate2( Myclass.sub )
let mc = Myclass()
// For instance methods, use the instance value name, the dot operator,
// and the instance method name.
let del3 : Delegate1 = new Delegate1( mc.Add )
let del4 : Delegate2 = new Delegate2( mc.Sub )
for (a, b) in [ (400, 200); (100, 45) ] do
printfn "%d + %d = %d" a b (InvokeDelegate1 del1 a b)
printfn "%d - %d = %d" a b (InvokeDelegate2 del2 a b)
printfn "%d + %d = %d" a b (InvokeDelegate1 del3 a b)
printfn "%d - %d = %d" a b (InvokeDelegate2 del4 a b)
Programı derleyip çalıştırdığınızda, aşağıdaki çıktıyı verir -
400 + 200 = 600
400 - 200 = 200
400 + 200 = 600
400 - 200 = 200
100 + 45 = 145
100 - 45 = 55
100 + 45 = 145
100 - 45 = 55