什么是C#委托
什么是委托
首先要知道什么是委托 用最通俗易懂的话来讲 你就可以把委托看成是用来执行方法(函数)的一个东西
如何使用委托
在使用委托的时候 你可以像对待一个类一样对待它 即先声明 再实例化 只是有点不同 类在实例化之后叫对象或实例 但委托在实例化后仍叫委托
声明 如
namespace Vczx ProCSharp Exc
{
delegate double MathsOp( double x )
//class defination here
}
这就声明了一个委托 意义 任何一个返回值为double 且只有一个形参为double的函数 都可以用这个委托来调用
注意 委托的声明位置在namespace里面 类的外面 其实 委托的声明也可以在类的里面 甚至是任何一个可以声明类的地方
实例化
首先我们要先有一个满足委托声明的方法 假设一个返回一个数的 倍的方法
class MathsOperations
{
public static double MultiplyBy ( double value )
{
return value *
}
}
有了这样一个方法 我们就可以实例化一个委托了
MathsOp operation = new MathsOp( MathsOperations MultiplyBy )
在实例化一个委托时 要给它一个参数 这个参数就是委托执行的方法 它可以是静态方法 也可以是实例方法(这一点有别于函数指针 函数指针只能调用静态方法) 如
MathsOp operation = new MathsOp( new Class () Method )
在实例化完一个委托之后 就可以用这个委托来调用方法了
double result = operation( )
例子代码
namespace Vczx ProCSharp Exc
{
delegate double MathsOp( double x )
class Start
{
public class MyDelegate
{
public static double MultiplyBy ( double x )
{
return x *
}
}
[STAThread]
static void Main(string[] args)
{
MathsOp operation = new MathsOp( MyDelegate MultiplyBy )
double x =
double result = operation( x )
Console WriteLine( { } multiply by is { } x result )
Console Read()
}
}
}
多路广播委托
前面使用的委托只包含一个方法调用 调用委托的次数与调用方法的次数相同 如果要调用多个方法 就需要多次显示调用这个委托 其实委托也可以包含多个方法 这种委托就是多路广播委托 多路广播委托派生于System MulticastDelegate 它的Combine方法允许把多个方法调用链接在一起 我们可以通过+=来向委托添加调用方法 也可以用 =删除其中的调用方法 如
namespace Vczx ProCSharp Exc
{
public class MyDelegate
{
public static void MultiplyBy ( double value )
{
double result = value *
Console WriteLine( Multiplying by { } gives { } value result )
}
public static void Squre( double value )
{
double result = value * value
Console WriteLine( Squaring { } gives { } value result )
}
}
delegate void MathsOp( double x )
class Start
{
[STAThread]
static void Main(string[] args)
{
MathsOp operation = new MathsOp( MyDelegate MultiplyBy )
operation += new MathsOp( MyDelegate Squre )
double x =
operation( x )
operation = new MathsOp( MyDelegate MultiplyBy )
operation( x )
Console Read()
}
}
}
输出
Multiplying by gives
Squaring gives
Squaring gives
注意 多路广播委托声明时必须返回void 否则返回值不知道应该送回什么地方 对此 我做了一个测试 如果不将委托的声明返回void 则返回值返回的是最后一个链入委托链的方法的返回值 编译不会出错
为什么要用委托
lishixinzhi/Article/program/net/201311/11900