物以类聚 人以群分

世上本无路,走的人多了便有了路!慢慢人生路,我会一直不停是去寻找那份财富!
委托的笔记(整理)

详细讲解地址:/Files/zskj008/Delegates-and-Events-in-CSharp.pdf
什么是委托

  首先要知道什么是委托,用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西。

如何使用委托
  在使用委托的时候,你可以像对待一个类一样对待它。即先声明,再实例化。只是有点不同,类在实例化之后叫对象或实例,但委托在实例化后仍叫委托。

声明,如:

1    namespace Vczx.ProCSharp.Exc
2    {
3        delegate double MathsOp( double x );
4        //class defination here
5    }

  这就声明了一个委托,意义:任何一个返回值为double,且只有一个形参为double的函数,都可以用这个委托来调用。
  注意:委托的声明位置在namespace里面,类的外面。其实,委托的声明也可以在类的里面,甚至是任何一个可以声明类的地方。
  实例化:
  首先我们要先有一个满足委托声明的方法,假设一个返回一个数的2倍的方法:

1class MathsOperations
2{
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 );

例子代码:

 1namespace Vczx.ProCSharp.Exc
 2{
 3    delegate double MathsOp( double x );
 4    class Start
 5    {
 6        public class MyDelegate
 7        {
 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(
"哈密瓜");
          
        }

    }

posted on 2008-05-07 20:58  默默無語中  阅读(174)  评论(0)    收藏  举报