C# 委托(Delegate、Action和Func的用法)

217 阅读2分钟

一、委托是什么

  • 委托:将方法作为方法的参数 。 存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。

听起来很拗口。我们来看个实例。设定一个方法,实现:

  • 输入英文名,输出“英文名,hello”。比如“Tom,hello,”
  • 输入中文名,输出“中文名,你好”。比如“铁蛋,你好”

你的思路是不是这样:创造一个英文名输出方法EnglishGreeting,一个中文名输出方法ChineseGreeting。需要哪个方法,就调哪个。委托就是负责调用方法的。 接下来我们用delegate实现这个方法。

二、delegate使用委托

以下代码实现了对 EnglishGreeting和ChineseGreeting方法 的引用。

  • 通过委托,将方法EnglishGreeting、ChineseGreeting作为了方法 GreetPeople的参数。
//委托的声明
public delegate void GreetingDelegate(string name);


class Program
{
    private static void EnglishGreeting(string name)
    {
        Console.WriteLine("Good Morning, " + name);
    }
    private static void ChineseGreeting(string name)
    {
        Console.WriteLine("早上好, " + name);
    }
    //传入string name,GreetingDelegate MakeGreeting
    //MakeGreeting 就是对方法的引用!!!
    private static void GreetPeople(string name, GreetingDelegate MakeGreeting)
    {
        MakeGreeting(name);
    }
    static void Main(string[] args)
    {
        //引用EnglishGreeting方法
        GreetPeople("Liker", EnglishGreeting);
        //引用ChineseGreeting方法
        GreetPeople("李志中", ChineseGreeting);

    }
}

再来看一个例子:该委托用于引用带有一个整型参数的方法。根据需求,对参数num做处理后,返回整型值结果。

//委托的声明
delegate int NumberChanger(int n);  
 
class TestDelegate  
{  
  static int num = 10;  
  public static int AddNum(int p)  
  {  
     num += p;  
     return num;  
  }  

  public static int MultNum(int q)  
  {  
     num *= q;  
     return num;  
  }  
  public static int getNum()  
  {  
     return num;  
  }  

  static void Main(string[] args)  
  {  
     // 创建委托实例  
     NumberChanger nc1 = new NumberChanger(AddNum);  
     NumberChanger nc2 = new NumberChanger(MultNum);  
     // 使用委托对象调用方法  
     nc1(25);   // 10 + 25 = 35
     Console.WriteLine("Value of Num: {0}", getNum());  
     nc2(5);   // 10 * 5 = 50
     Console.WriteLine("Value of Num: {0}", getNum());  
  }  
}  

三、 Action的用法

C#中预定义了一个委托类型Action. Action 不能指向有返回值的方法 , 不能有返回值 。

3.1 Action基本使用

调用方法

static void printString(){
  Console.WriteLine("Hello World");
}

static void Main(String[] args){
  Action a = printString;
  a(); // 输出结果  Hello World
}

3.2 Action指向有参数的方法

static void printNumber(int x){
    Console.WriteLine(x);
}

static void Main(String[] args){
  Action<int> a = printNumber; // 定义一个指向 形参为int的函数
  a(5); // 输出结果  5
}

四、 Func的用法

Func 也是C#预定义的委托, 且可以指向带有一个返回值的方法,传递0-16个参数。

4.1指定返回值

static int GetNumber()
{
    return 1;
}

static void Main(string[] args)
{
 Func<int> a = GetNumber; // 定义一个Func 委托,  指向一个返回int类型的 方法
 Console.WriteLine(a()); //输出1
}

4.2 指定参数和返回值的例子

static int Test2(string str){
  return 1;
}

static void Main(string[] args){
 Func<string, int> a = Test2; // 泛型中最后一个参数表示返回值类型。
 Console.WriteLine(a("a"));
}