很多初学者在学C#委托的时候经常不知道委托到底有什么用,刚好最近在研究C#,给大家提供一个委托使用的思路。
我们先假设这样一个场景:你是一个图书管理员,来图书馆借书的人会告诉你他想要的书和数量,然后你根据他的需求给他找到想要的书。
如果一个人只找一个种类的书,那么逻辑很简单,只需要if/else就能完成。但是如果想要找的书种类不同数量不一样,并且种类数量没有规定的时候,使用if/else就会复杂很多。这个时候我们就可以使用委托。
思路如下:
1.首先定义一个管理员类,然后定义找不同类型的书的方法。
class Librarian
{
public void FindStoryBook(int count)
{
Console.WriteLine("Find story book * " + count);
}
public void FindMathBook(int count)
{
Console.WriteLine("Find math book * " + count);
}
public void FindHistoryBook(int count)
{
Console.WriteLine("Find history book * " + count);
}
public void FindComicBook(int count)
{
Console.WriteLine("Find coimc book * " + count);
}
}
2.在类里定义一个委托:
public delegate void FindBook(int count);
3.定义一个类型名称和行为的对照字典
public Dictionary<string, FindBook> bookMenu;
4.定义构造函数,在构造函数中创建字典并加入图书类型及对应函数
public Librarian()
{
bookMenu = new Dictionary<string, FindBook>();
bookMenu["story"] = new FindBook(FindStoryBook);
bookMenu["math"] = new FindBook(FindMathBook);
bookMenu["history"] = new FindBook(FindHistoryBook);
bookMenu["comic"] = new FindBook(FindComicBook);
}
5.使用图书管理员类,可以看到我们只需要知道图书的名字就可以直接从字典中找到对应的函数并调用,不需要很多的判断分支语句,在更为复杂的情况中可以使代码显得更加简洁。
static void Main(string[] args)
{
Librarian libarary = new Librarian();
Console.WriteLine("whitch book do you want ? ");
string book = Console.ReadLine();
if (!libarary.bookMenu.ContainsKey(book))
Console.WriteLine("sorry,there is no such book");
else
Console.WriteLine("how many books do you want ? ");
int count = int.Parse(Console.ReadLine());
libarary.bookMenu[book](count);
Console.Read();
}
完整代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DelegateTest
{
class Librarian
{
public delegate void FindBook(int count);
public Dictionary<string, FindBook> bookMenu;
public Librarian()
{
bookMenu = new Dictionary<string, FindBook>();
bookMenu["story"] = new FindBook(FindStoryBook);
bookMenu["math"] = new FindBook(FindMathBook);
bookMenu["history"] = new FindBook(FindHistoryBook);
bookMenu["comic"] = new FindBook(FindComicBook);
}
public void FindStoryBook(int count)
{
Console.WriteLine("Find story book * " + count);
}
public void FindMathBook(int count)
{
Console.WriteLine("Find math book * " + count);
}
public void FindHistoryBook(int count)
{
Console.WriteLine("Find history book * " + count);
}
public void FindComicBook(int count)
{
Console.WriteLine("Find coimc book * " + count);
}
static void Main(string[] args)
{
Librarian libarary = new Librarian();
Console.WriteLine("whitch book do you want ? ");
string book = Console.ReadLine();
if (!libarary.bookMenu.ContainsKey(book))
Console.WriteLine("sorry,there is no such book");
else
Console.WriteLine("how many books do you want ? ");
int count = int.Parse(Console.ReadLine());
libarary.bookMenu[book](count);
Console.Read();
}
}
}