委托(delegate)是c#里面很重要的一个知识点,刚开始接触委托时,有点看不懂代码,不清楚委托的语法和用法,所以自己上网查资料,总结了委托的知识点。
什么是委托?
定义:委托(delegate)是一个类,它定义了方法的类型,使得可以将方法作为一个另一个方法的参数来传递。总而言之,委托就是可以将方法作为参数传递给另一个方法。
委托语法
1.声明一个委托类型
2.委托所指向的函数必须跟委托具有相同的签名(相同的签名:参数和返回值都相同)
用中英文打招呼的例子:
using System;
namespace 委托
{
//声明一个委托,指向一个函数
public delegate void delHi(string name);
class Program
{
static void Main(string[] args)
{
test("hehe", HiChinese);
Console.ReadKey();
}
public static void test(string name, delHi del)
{
del(name);
}
public static void HiChinese(string name)
{
Console.WriteLine("吃了吗?" + name);
}
public static void HiEnglish(string name)
{
Console.WriteLine("Hi!" + name);
}
}
}
通过上面例子我们可以知道,我们把中文打招呼的方法,作为参数传给test方法,然后通过调用test方法来实现HiChinese方法的调用。
委托的语法和线程的语法有点类似,Thread thread = new Thread(添加的数值);
而委托也相似(基于上面的例子)delHi del = new delHi(HiChinese);或者delHi del = HiChinese;
通过反编译,我们得知,在后者中,我们可以把方法直接赋值给一个委托类型的对象,程序也会帮我们创建委托对象,和前者一样的语法相同。
为什么要使用委托?
这就是委托的好处,假如有好多功能有很多地方相似,全部调用,代码就太多了,但是用委托就能很好来实现,代码量也好减少很多,比如:
在上面的输出中,我就想要第二行的abcbbbbb换为aaaaaaaa,这时候我们就要用到委托,来把第二行的输出换为我们自定义的方法(输出aaaaaaaa的方法)的输出,就能实现。所以,委托在日志的打印中运用的很多。
匿名委托
用delegate关键字来代替方法的名字,该方法没有名字。
匿名函数也要跟委托的签名一样,下面是一个例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 匿名委托
{
public delegate void delSayHi(string name);
class Program
{
static void Main(string[] args)
{
delSayHi del = delegate (string name)
{
Console.WriteLine("你好:" + name);
};
del("张三");
Console.ReadKey();
}
//public static void HiChinese(string name)
//{
// Console.WriteLine("吃了吗?" + name);
//}
//public static void HiEnglish(string name)
//{
// Console.WriteLine("Hi!" + name);
//}
}
}
在上面的例子中,我们可以不用写HiChinese和HiEnglish两个方法,直接用匿名委托来实现。
匿名委托什么时候用?
当我们定义的方法只调用一次,我们可以把这个方法写成匿名委托。
lambda表达式
格式:lambda表达式 => goes to(lambda表达式 =(参数)=> { 返回值; })
匿名委托和lambda表达式的转换,
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace lambda表达式
{
public delegate void DelOne();
public delegate void DelTwo(string name);
public delegate string DelThree(string name);
class Program
{
static void Main(string[] args)
{
DelOne d1 = () => { };
DelTwo d2 = (string name) => { };
DelThree d3 = (string name) => { return name; };
}
}
}