委托(Delegates)是一个引用类型变量,其中包含对方法的引用,可以在运行时更改参考, F#委托类似于 C 或C ++中的函数指针。
委托声明确定委托可以引用的方法。
type delegate-typename=delegate of type1 -> type2
如-
//Delegate1 使用元组参数。 type Delegate1=delegate of (int * int) -> int //Delegate2 使用 curried 参数。 type Delegate2=delegate of int * int -> int
这两个委托都可以用来引用具有两个 int 参数并返回 int 类型变量的任何方法。
用语法-
type1 表示参数类型。
type2 表示返回类型。
以下示例演示了概念-
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 使用元组参数。 type Delegate1 = delegate of (int * int) -> int //Delegate2 使用 curried 参数。 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) //对于静态方法,使用类名、点运算符和静态方法的名称。 let del1 : Delegate1 = new Delegate1( Myclass.add ) let del2 : Delegate2 = new Delegate2( Myclass.sub ) let mc = Myclass() //对于实例方法,使用实例值名称、点运算符、和实例方法名称。 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)
编译并执行程序时,将产生以下输出-
400 + 200=600 400 - 200=200 400 + 200=600 400 - 200=200 100 + 45=145 100 - 45=55 100 + 45=145 100 - 45=55
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)