一、委托是什么
- 委托:将方法作为方法的参数 。 存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。
听起来很拗口。我们来看个实例。设定一个方法,实现:
- 输入英文名,输出“英文名,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"));
}