委托的笔记(整理)
详细讲解地址:/Files/zskj008/Delegates-and-Events-in-CSharp.pdf
什么是委托
首先要知道什么是委托,用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西。
如何使用委托
在使用委托的时候,你可以像对待一个类一样对待它。即先声明,再实例化。只是有点不同,类在实例化之后叫对象或实例,但委托在实例化后仍叫委托。
声明,如:
namespace Vczx.ProCSharp.Exc2
{3
delegate double MathsOp( double x );4
//class defination here
5
}这就声明了一个委托,意义:任何一个返回值为double,且只有一个形参为double的函数,都可以用这个委托来调用。
实例化:
首先我们要先有一个满足委托声明的方法,假设一个返回一个数的2倍的方法:
class MathsOperations2
{3
public static double MultiplyBy2( double value )4
{5
return value * 2;6
}7
} 有了这样一个方法,我们就可以实例化一个委托了:
MathsOp operation = new MathsOp( MathsOperations.MultiplyBy2 );
在实例化一个委托时,要给它一个参数,这个参数就是委托执行的方法,它可以是静态方法,也可以是实例方法(这一点有别于函数指针,函数指针只能调用静态方法),如:
MathsOp operation = new MathsOp( new Class1().Method1 );
在实例化完一个委托之后,就可以用这个委托来调用方法了:
double result = operation( 1.23 );
例子代码:
namespace Vczx.ProCSharp.Exc2
{3
delegate double MathsOp( double x );4
class Start5
{6
public class MyDelegate7
{8
public static double MultiplyBy2( double x )9
{10
return x * 2;11
}12
}13
[STAThread]14
static void Main(string[] args)15
{16
MathsOp operation = new MathsOp( MyDelegate.MultiplyBy2 );17
double x = 1.23;18
double result = operation( x );19
Console.WriteLine( "{0} multiply by 2 is {1}", x, result ); 20
Console.Read();21
}22
}23
}委托的定义:
委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针。
委托的优点:
压缩方法的调用。
合理有效地使用委托能提升应用程序的性能。
用于调用匿名方法。
委托的声明:
委托应使用public delegate type_of_delegate delegate_name()的形式来声明。
示例:public delegate int mydelegate(int delvar1,int delvar2)
注意点:可以在不带参数或参数列表的情况下声明委托。
应当遵循和声明方法一样的语法来声明委托。
使用委托的示例程序:
public delegate double Delegate_Prod(int a,int b);
class Class1
{
static double fn_Prodvalues(int val1,int val2)
{
return val1*val2;
}
static void Main(string[] args)
{ 
//Creating the Delegate Instance
Delegate_Prod delObj = new Delegate_Prod(fn_Prodvalues);
Console.Write("Please Enter Values");
int v1 = Int32.Parse(Console.ReadLine());
int v2 = Int32.Parse(Console.ReadLine());
//use a delegate for processing
double res = delObj(v1,v2);
Console.WriteLine ("Result :"+res);
Console.ReadLine();
}
}

示例程序解析:
上面我用一段小程序示范了委托的使用。委托Delegate_Prod声明时指定了两个只接受整型变量的返回类型。同样类中名为fn_Prodvalues的方法也是如此,委托和方法具有相同的签名和参数类型。
在Main方法中创建一个委托实例并用如下方式将函数名称传递给该委托实例:
Delegate_Prod delObj = new Delegate_Prod(fn_Prodvalues);
这样我们就接受了来自用户的两个值并将其传递给委托:
delObj(v1,v2);
在此委托对象压缩了方法的功能并返回我们在方法中指定的结果。
多播委托:
多播委托包含一个以上方法的引用。
多播委托包含的方法必须返回void,否则会抛出run-time exception。
使用多播委托的示例程序:
delegate void Delegate_Multicast(int x, int y);
Class Class2
{
static void Method1(int x, int y) {
Console.WriteLine("You r in Method 1");
}
static void Method2(int x, int y) {
Console.WriteLine("You r in Method 2");
}
public static void Main()
{
Delegate_Multicast func = new Delegate_Multicast(Method1);
func += new Delegate_Multicast(Method2);
func(1,2); // Method1 and Method2 are called
func -= new Delegate_Multicast(Method1);
func(2,3); // Only Method2 is called
}
}
示例程序解析:
大家可以看到上面的示例程序分别定义了名为method1 和 method2的两个接受整型参数、返回类型为void的方法。
在Main函数里使用下面的声明创建委托对象:
Delegate_Multicast func = new Delegate_Multicast(Method1);
然后使用+= 来添加委托,使用-=来移除委托。
delegate void Eatfood(string food); //委托调用方法
class Test
{
private string name;
public Test(string name)
{
this.name = name;
}
public void eat(string food)
{
Console.WriteLine(name + "吃" + food);
}
}
class disp
{
static void Main()
{
//Test a = new Test();
//a.zsfood("西瓜");
//a.lsfood("橡胶");
Test aa = new Test("张三");
Test bb = new Test("李四");
Eatfood zs = new Eatfood(aa.eat);
Eatfood ls = new Eatfood(bb.eat);
Eatfood eat;
eat = zs + ls;
eat("哈密瓜");
}
}
浙公网安备 33010602011771号