C#中的委托(一)

1、委托程序员

      把方法做为参数传给其余方法;数组

2、声明委托安全

     在C#中使用一个类时,分两个阶段。首先,须要去定义一个类,而后实例化类的一个对象(只须要静态方法除外)。 使用委托也须要通过这2个步骤,首先必须定义要使用的委托,对于委托,定义它就是告诉编译器这种类型的委托表示哪一种类型的方法。而后,必须建立该委托的一个或多个实例。编译器在后台将建立表示该委托的一个类。定义委托的语法以下:函数

delegate void IntMethodInvoker(int x);

     在这个示例中,定义了一个委托IntMethodInvoker,并指定该委托的每一个实例均可以包含一个方法的引用,该方法带有一个int参数,并返回void。理解委托的一个要点就是他们的类型安全性很是高。在定义委托时,必须给出它所表示的方法的签名和返回类型等所有细节;spa

     假设要定义一个委托,该委托表示的方法包含有两个decimal型的参数,返回类型为decimal;指针

delegate decimal MethodInvoker(decimal x, decimal y);

3、使用委托code

      首先定义好委托,而后建立该委托的一个或多个实例;假设我要使用上面MethodInvoker的话,代码以下:对象

MethodInvoker invoker = new MethodInvoker(Math.Max);
decimal x = invoker(5.20m, 5.21m);
Console.WriteLine("x:" + x);

     在这里咱们把Math.Max(decimal val1,decimal val2) 返回传给了委托;得出2个值中最大一个值,运行上面代码能够获得以下结果:blog

    若是MethodInvoker委托,只是想获得2个参数进行一系列操做后返回一个结果。上面的结构就不能知足这个需求,由于已经限制好了参数类型和返回类型。说到这,对泛型熟悉的朋友就应该知道,若是采用泛型去声明该委托,就能够解决这个问题了。咱们就接着上面的代码改造:ci

delegate T MethodInvoker<T>(T x1, T x2);

MethodInvoker<decimal> invoker = new MethodInvoker<decimal>(Math.Max);
decimal x = invoker(5.20m, 5.21m);
Console.WriteLine("x:" + x);
Console.ReadLine();
MethodInvoker<double> invoker1 = new MethodInvoker<double>(Math.Pow);
double x1 = invoker1(10, 3);
Console.WriteLine("x:" + x1);

输出结果:

 

    参与泛型的方式声明委托后就能够知足输入2个参数进行操做后获得一个返回结果;

4、简单委托示例

     定义一个简单的数据操做类MathOperation,添加2个静态方法Add(int,int)、Reduce(int,int),两个方法都返回int类型,代码以下:

    public class MathOperation
    {
        public int Add(int x, int y)
        {
            return x + y;
        }

        public int Reduce(int x, int y)
        {
            return x - y;
        }
    }

     下面调用这些方法:

          delegate int MathOperDelegate(int x, int y);

            MathOperDelegate[] operation = { 
                                           MathOperation.Add,
                                           MathOperation.Reduce
                                           };

            for (int i = 0; i < operation.Length; i++)
            {
                Console.WriteLine("执行第{0}个委托方法", i);
                for (int j = 1; j < 10; j++)
                {
                    Console.WriteLine("执行结果为:{0}", operation[i](i, j));
                    Thread.Sleep(20);
                }
            }

     在这段代码中,实例化了一个MethodDelegate委托的数组,而后遍历这个数组,而后执行其中的不一样返回,获得的结果以下:

5、为何要使用委托

      使用委托使程序员能够将方法引用封装在委托对象内。而后能够将该委托对象传递给可调用所引用方法的代码,而没必要在编译时知道将调用哪一个方法。与C或C++中的函数指针不一样,委托是面向对象,并且是类型安全的。

相关文章
相关标签/搜索