a、委托是什么
1. 委托的定义:
使用delegate关键字定义委托(注:委托没有方法体,类似于接口中的方法)。委托定义前,需要明确的问题:
- 是委托将要绑定的方法;
- 是委托的形参类型、形参个数以及返回值,必须与将要绑定的方法的形参类型、形参个数及返回值一致。
2.相关概念:
委托涉及的相关概念有函数指针 、类型安全性、事件、Lambda表达式等。
- 函数指针:在C++中,指针的一个类别,主要指向函数(变量指针,主要指向变量地址),可以吧C#中的委托理解为函数指针。
- 类型安全性:在C++中,我们都知道指针是类型不安全的(返回值、返回类型以及什么时候返回,这些都是未知的),然而委托是类型安全的;
- 事件:可以把事件理解为一种特殊的委托;
- Lambda表达式:委托与Lambda表达式相结合,可以实现高效编程、它与jQuery中“使用较少的代码做更多的事”类似。委托与Lambda、Linq相结合,使较短的代码实现比较复杂的功能。
3.委托的组成:
主要分为两部分去实现:
- 声明委托:使用delegate关键字声明;
- 绑定方法(注册方法):绑定具体方法、传递方法名称。
4.委托的分类:
- 单播委托:顾名思义只能绑定一个方法;
- 多播委托:则可以绑定多个方法。
5.委托的操作:
- 绑定方法;
- 解绑方法。
b、委托能解决那些问题呢?
- 避免核心方法中存在太多的if…else…语句或者switch开关语句;
- 满足程序设计的OCP(开-闭原则)原则;
- 使得程序具有扩展性;
- 绑定事件;
- 结合Lambda表达式,简化代码,高效编程;
- 实现程序的松耦合(解耦),这种情况在事件(event)中体现的比较明显。
c、委托的使用:
1. 定义委托:
public delegate 委托返回的类型 委托名(形参)
2.使用委托,举例:
static void Main(string[] args)
{
Console.WriteLine("----------请输入用户名:----------");
string userName = Console.ReadLine();
Console.WriteLine("----------请输入语言----------");
string language = Console.ReadLine();
GetPeopleGreetings getGreeetings = new GetPeopleGreetings();
if (language.Equals("Chinese"))
Console.WriteLine(GetGreetingsStrings(userName, getGreeetings.GetChineseGreeting));
else if (language.Equals("English"))
Console.WriteLine(GetGreetingsStrings(userName, getGreeetings.GetEnglishGreeting));
else
Console.WriteLine(GetGreetingsStrings(userName, getGreeetings.GetOtherGreeting));
Console.ReadKey();
}
/// <summary>
/// 一个参数的委托
/// </summary>
/// <param name="userName"></param>
/// <param name="getGreetingsByDelegate"></param>
/// <returns></returns>
public static string GetGreetingsStrings(string userName, GetGreetingsByDelegate getGreetingsByDelegate)
{
return getGreetingsByDelegate(userName);
}
定义委托:
public delegate string GetGreetingsByDelegate(string userName);
定义给委托绑定的方法:
public class GetPeopleGreetings
{
public string GetGreetingsByUserNameAndLanguage(string userName, string Language)
{
return $"你好!{userName},先生,您说的是“{Language}”语言吗?";
}
public string GetChineseGreeting(string userName)
{
return "您好!" + userName + "先生。";
}
public string GetEnglishGreeting(string userName)
{
return "Hello," + userName + "!";
}
public string GetOtherGreeting(string userName)
{
return "sorry!当前系统只支持汉语和英语。";
}
}
3.绑定方法:
- 单播绑定:绑定单个方法,将单个方法名字传给委托即可(上面的例子就是单播绑定的实现);
Console.WriteLine("----------请输入用户名:----------");
string userName = Console.ReadLine();
Console.WriteLine("----------请输入语言----------");
string language = Console.ReadLine();
GetPeopleGreetings getGreeetings = new GetPeopleGreetings();
GetGreetingsByDelegate gg;
if (language.Equals("Chinese"))
{
gg = getGreeetings.GetChineseGreeting;
Console.WriteLine(gg(userName));
}
else if (language.Equals("English"))
{
gg = getGreeetings.GetEnglishGreeting;
Console.WriteLine(gg(userName));
}
else
{
gg = getGreeetings.GetOtherGreeting;
Console.WriteLine(gg(userName));
}
Console.ReadKey();
- 多播绑定(绑定多个方法,注意:绑定多个方法时,委托范围类型必须为void类型,否则只返回最后一个绑定的值。),如下:
static void Main(string[] args)
{
GetPeopleGreetings greeetings = new GetPeopleGreetings();
GetGreetingStrings gg;
gg = greeetings.ChineseGreetings;
gg += greeetings.EnglishGreetings;
gg("谢文东!");
Console.ReadKey();
}
定义绑定多个方法的委托:
public delegate void GetGreetingStrings(string userName);
定义给委托绑定的方法:
public class GetPeopleGreetings
{
public void ChineseGreetings(string userName)
{
Console.WriteLine($"你好!{userName},先生。");
}
public void EnglishGreetings(string userName)
{
Console.WriteLine($"Hello,{userName}!");
}
}
总结,绑定多个方法时,用“+=”绑定。
4.委托解绑:
当然解载绑定的方法,我们用的是“-=”解绑的。
static void Main(string[] args)
{
GetPeopleGreetings greeetings = new GetPeopleGreetings();
GetGreetingStrings gg;
gg = greeetings.ChineseGreetings;
gg += greeetings.EnglishGreetings;
gg -= greeetings.ChineseGreetings;
gg("谢文东!");
Console.ReadKey();
}
完。
此笔记参考资料来源于:https://www.cnblogs.com/wangjiming/p/8300103.html博客信息。
在那一刻,我意识到,我必须选择,要么对一切屈服,得过且过地生活,要么就得努力,争取过上梦想的生活。