C# 委托的理解

委托(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; };
}
}
}

posted on 2018-10-19 17:21  吴qx  阅读(502)  评论(0编辑  收藏  举报