C# 委托(Delegate)

我们已经提到过,委托是用于引用与其具有相同标签的方法。换句话说,您可以使用委托对象调用可由委托引用的方法。

相同标签方法

相同标签方法,是指一个方法的 返回类型、参数类型、参数个数和其他方法一模一样 例如我们指定一个方法

public int MultNum(int q){}

它和以下几种函数是具有相同标签

public int AddNum(int q){}
public int AddNum2(int h ){}
public int MinusNum(int g ){}

但它和以下方法就不是相同标签方法

public int AddNum(int q,int p ){}  // 返回值相同,但是参数个数不同
public int AddNum2(byte q){}       // 返回值相同,参数个数相同,但是参数类型不同
public byte AddNum3(int h){}       // 参数个数和参数类型相同,但是返回值类型不同

匿名方法(Anonymous methods)

匿名方法是没有名称只有主体的方法。

C# 2.0引入了匿名方法。

开发人员在实现方法的时候,只需要给出方法的参数列表(甚至也可以不给)以及方法具体实现,而不需要关心方法的返回值,更不必给方法起名字。

最关键的是,只在需要的地方定义匿名方法,保证了代码的简洁。

他的优点如下:

  • 匿名方法可以在需要时再定义。
  • 匿名方法提供了一种传递代码块作为委托参数的技术。
  • 使用匿名方法时您不需要指定返回类型,它是从方法主体内的 return 语句推断的。

匿名方法语法

匿名方法是通过使用 delegate 关键字创建委托范例来声明的

delegate parameters {implementationcode};
关键字  参数        语句块

例如:

delegate(int x)
{
    Console.WriteLine("Anonymous Method: {0}", x);
};

以上代码就创建了一个匿名方法,这个匿名方法有一个 int 类型的参数

代码块 Console.WriteLine("Anonymous Method: {0}", x); 是匿名方法的主体。

匿名方法不会声明返回值类型。但是匿名方法返回值类型必须和委托返回值一样。

参数:参数数量,类型和修饰符必须和委托一样。

当我们的匿名方法没有任何参数或者参数列表不包含任何out参数时,我们可以使用空圆括号(),或省略圆括号来简化匿名方法的参数列表。

调用委托

委托可以通过匿名方法调用,也可以通过命名方法调用,即,通过向委托对象传递方法参数。

例如:

nc(10);

范例

下面的范例演示了匿名方法和委托的使用方式:

using System;

delegate void NumberChanger(int n);
namespace DelegateAppl
{
    class TestDelegate
    {
        static int num = 27;
        public static void AddNum(int p)
        {
            num += p;
            Console.WriteLine("Named Method: {0}", num);
        }

        public static void MultNum(int q)
        {
            num *= q;
            Console.WriteLine("Named Method: {0}", num);
        }
        public static int getNum()
        {
            return num;
        }

        static void Main(string[] args)
        {
            // 使用匿名方法创建委托范例
            NumberChanger nc = delegate(int x)
            {
               Console.WriteLine("Anonymous Method: {0}", x);
            };

            // 使用匿名方法调用委托
            nc(18);

            // 使用命名方法范例化委托
            nc =  new NumberChanger(AddNum);

            // 使用命名方法调用委托
            nc(4);

            // 使用另一个命名方法范例化委托
            nc =  new NumberChanger(MultNum);

            // 使用命名方法调用委托
            nc(2);
            Console.ReadKey();
        }
    }
}

当上面的代码被编译和执行时,它会产生下列结果:

Anonymous Method: 18
Named Method: 31
Named Method: 54
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.