很多初学者在学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");elseConsole.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");elseConsole.WriteLine("how many books do you want ? ");int count = int.Parse(Console.ReadLine());libarary.bookMenu[book](count);Console.Read();}}
}

C# Delegate 委托使用场景相关推荐

  1. Strategy模式与Delegate委托

    Strategy模式是对算法的封装.即使是一个计算行为,如果其实现有其多样性,为达到易扩展的目的,我们也有必要将其抽象出来,以接口的形式来定义.由于充分利用了面向对象的多态性,在调用该行为时,其具体的 ...

  2. delegate委托

    delegate委托: 三个概念: C# 中的委托类似于 C 或 C++ 中的函数指针. 委托是面向对象.类型安全的,并且是安全的. 委托和接口的类似之处是:它们都允许分隔规范和实现. 一个原则: 被 ...

  3. C# Delegate(委托)与多线程

    C# Delegate(委托)与多线程 很多时候写windows程序都需要结合多线程,在.net中用如下得代码来创建并启动一个新的线程.     public void ThreadProc();   ...

  4. 【C#学习】delegate(委托) 和 event(事件)

    C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针.委托(Delegate) 是存有对某个方法的引用的一种引用类型变量.引用可在运行时被改变.在C#中方法不能作为参数直接传递,必须 ...

  5. 转:终于会用c#中的delegate(委托)和event(事件)了

    第一个例子: public class DelegateTest {// 声明delegate对象 public delegate void CompareDelegate(int a,int b); ...

  6. Delegate委托的使用

    Delegate委托的使用 委托的说明 委托(delegate)是Cocoa的一个术语,表示将一个对象的部分功能转交给另一个对象. 比如对象A希望对象B知道将要发生或已经发生某件事情,对象A可以把对象 ...

  7. UE4 C++:Delegate委托

    目录 概念 定义 声明委托 单播委托 声明宏 绑定委托 执行函数 用法示例 不带参数Delegate 带参数Delegate 传递有效负载数据 多播委托 声明宏 绑定多播委托 多播执行 动态委托 声明 ...

  8. C#学习基本概念之关键字---delegate(委托)

    委托类型的声明与方法签名相似,  有一个返回值和任意数目任意类型的参数: public delegate void TestDelegate(string message); public deleg ...

  9. Csharp关键字----delegate(委托)

    Delegate类简介 ------------------------      命名空间:System 程序集:mscorlib(在 mscorlib.dll 中) 委托(Delegate)类是一 ...

最新文章

  1. Chrome使用技巧和编辑框拖动怪问题。
  2. Qt QML页面翻转控件封装
  3. 8.ActionContext类与Servlet API解耦的访问方式
  4. 不想当全栈的设计师不是_但我不想成为产品设计师
  5. windows7下iis网站的.net框架版本设置
  6. 中发生数据丢失_如何防止Redis脑裂导致数据丢失?
  7. java 类编译_Java类编译、加载、和执行机制
  8. 深入理解Java类加载器(2)
  9. 1024程序员节:心疼被段子手黑得最惨的你们
  10. Java并发(七)——并发容器
  11. 三层实例--加入信息
  12. gitee及github的区别
  13. 内存屏障 - MemoryBarrier
  14. 64位Ubuntu14.04系统无法解压bin文件的解决方法
  15. python语句分号_你知道分号在各种编程语言中的作用吗?
  16. sql语句中case when和as用法
  17. Win11 Wifi消失,网络适配器黄色感叹号解决方案
  18. linux查看统计数据命令,查看,统计、正则表达式――Linux基本命令(9)
  19. 数据库初级入门sqlite3版本
  20. Multism14安装问题

热门文章

  1. javascript 链式调用实现原理
  2. C语言中 “重定义;不同的基类型” 的错误
  3. 金融银行业安防系统安全防护解决方案
  4. 金融危机下最抢手的IT人才
  5. FreeMaker模板引擎
  6. SQL server基本的代码操作
  7. 同样是是建模 为啥在游戏公司和在影视公司的待遇不一样?
  8. 无人收银商店为购物的未来铺平道路
  9. 基于JSP的局域网图书馆管理系统
  10. 重装mysql数据库