博主文章仅用于学习、研究和交流目的,不足和错误之处在所难免,希望大家能够批评指出,博主核实后马上更改。
一、委托是什么?
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。我们知道委托是一个引用类型,所以它具有引用类型所具有的通性。它保存的不是实际值,而是保存对存储在托管堆(managed heap)中的对象的引用。那它保存的是对什么的引用呢?委托保存的是对函数(function)的引用,在C#中使用delegate关键字定义委托,然后使用我们熟悉的函数调用的语法来调用委托。
二、委托简单使用
1.传统委托编写
无返回值委托(示例代码):
class Program
{ //定义一个无返回值的委托
public delegate void DelegateNoReturn(int s1, int s2);
public static void NoReturn(int s1, int s2)
{
Console.WriteLine(s1 + s2);
}
static void Main(string[] args)
{
DelegateNoReturn d1;
d1 = NoReturn;
d1(1, 2);
Console.ReadLine();
}
}
有返回值委托(示例代码):
class Program
{
//定义一个无返回值的委托
public delegate void DelegateNoReturn(int s1, int s2);
//定义一个有返回值的委托
public delegate string DelegateHaveReturn(string s1, string s2);
public static void NoReturn(int s1, int s2)
{
Console.WriteLine("无返回值的委托:"+(s1 + s2));
}
public static string HaveReturn(string s1, string s2)
{
return "有返回值的委托:" + s1 + s2;
}
static void Main(string[] args)
{
DelegateNoReturn d1;
DelegateHaveReturn d2;
d1 = NoReturn;
d2 = HaveReturn;
d1(1, 2);
var a = d2("zhang", "san");
Console.WriteLine(a);
Console.ReadLine();
}
}
2.泛型委托Action和Fun
注: Action和Fun两个委托的不同点:
Action只能委托必须是无返回值的方法
Fun只是委托必须有返回值的方法
Action/Fun委托(示例代码):
class Program
{ //定义一个无返回值的委托
public delegate void DelegateNoReturn(int s1, int s2);
//定义一个有返回值的委托
public delegate string DelegateHaveReturn(string s1, string s2);
public static void NoReturn(int s1, int s2)
{
Console.WriteLine("无返回值的委托:"+(s1 + s2));
}
public static string HaveReturn(string s1, string s2)
{
return "有返回值的委托:" + s1 + s2;
}
static void Main(string[] args)
{
DelegateNoReturn d1;
DelegateHaveReturn d2;
d1 = NoReturn;
d2 = HaveReturn;
d1(1, 2);
var a = d2("zhang", "san");
Console.WriteLine(a);
Console.WriteLine("===========Action/Func演示=========================");
Action<int,int> action = NoReturn;
action(1, 2);
Func<string, string,string> func = HaveReturn;
Console.WriteLine(func("zhang","san"));
Console.ReadLine();
}
}
3. Action 详解
注:声明一个Action,进入方法,可见底层也是一个委托声明,由关键字delegate
注:声明一个Action,进入方法,可传入16个参数,重载16个方法
Action委托(示例代码):
//Action示例代码
Action<int, string> action1 = (int a1, string b1) =>
{
Console.WriteLine("Action演示:" + a1 + b1);
};
//调用
action1(1, "2");
4. Fun 详解
注:声明一个Func,进入方法,可见底层也是一个委托声明,由关键字delegate,并且是有返回值的
注:声明一个Func,进入方法,可传入16个参数,重载17个方法
Action委托(示例代码):
//Func示例代码
Func<int, string> func1 = (int a1) =>
{
return a1.ToString();
};
//调用
Console.WriteLine("Func演示:" + func1(1));