Fsharp Delegates Fsharp Delegates Fsharp Delegates
اعلان Delegates در #F
اعلان Delegates، روش هایی را که می تواند توسط Delegates قابل اشاره باشد، تعیین می کند. یک Delegates می تواند به روشی اشاره کند، که همان signature را به عنوان Delegates دارد.
نحوه اعلان Delegates در #F
1 | type delegate-typename = delegate of type1 -> type2 |
خروجی
1 2 3 4 5 | // Delegate1 works with tuple arguments. type Delegate1 = delegate of (int * int) -> int // Delegate2 works with curried arguments. type Delegate2 = delegate of int * int -> int |
هر دو delegates می توانند برای ارجاع هر متدی که دارای دو پارامتر int باشند و یک متغیر نوع int را برمی گرداند استفاده می شود.
سینتکس
- type1 نشانگر آرگومان نوع (s) است.
- type2 نشان دهنده نوع بازگشتی است.
لطفا توجه داشته باشید
- انواع آرگومان به صورت اتوماتیک تنظیم می شوند.
- delegates می توانند به مقادیر تابع و روش های استاتیک یا متد instance داده شوند.
- #F تابع مقادیر را می تواند به طور مستقیم به عنوان آرگومان به delegate constructors منتقل کند.
- یک روش استاتیک delegates با استفاده از نام کلاس و متد نامیده می شود. برای مثال instance متد، نام آبجکت instance و متد، مورد استفاده قرار می گیرد.
- متد Invoke در نوع delegate ، تابع encapsulated را فراخوانی می کند.
- همچنین، delegates می توانند به عنوان تابع مقادیر، با مراجعه به نام متد Invoke بدون پرانتز منتقل شوند.
مثال زیر این مفهوم را نشان می دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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) |
خروجی
1 2 3 4 5 6 7 8 | 400 + 200 = 600 400 - 200 = 200 400 + 200 = 600 400 - 200 = 200 100 + 45 = 145 100 - 45 = 55 100 + 45 = 145 100 - 45 = 55 |
هر دو delegates می توانند برای ارجاع هر متدی که دارای دو پارامتر int باشند و یک متغیر نوع int را برمی گرداند استفاده می شود.type1 نشانگر آرگومان نوع (s) است.type2 نشان دهنده نوع بازگشتی است.لطفا توجه داشته باشیدانواع آرگومان به صورت اتوماتیک تنظیم می شوند.delegates می توانند به مقادیر تابع و روش های استاتیک یا متد instance داده شوند.#F تابع مقادیر را می تواند به طور مستقیم به عنوان آرگومان به delegate constructors منتقل کند.یک روش استاتیک delegates با استفاده از نام کلاس و متد نامیده می شود. برای مثال instance متد، نام آبجکت instance و متد، مورد استفاده قرار می گیرد.متد Invoke در نوع delegate ، تابع encapsulated را فراخوانی می کند.همچنین، delegates می توانند به عنوان تابع مقادیر، با مراجعه به نام متد Invoke بدون پرانتز منتقل شوند.مثال زیر این مفهوم را نشان می دهد.