使用之前先大概了解一下,什么是委托?

从字面意思来理解:我委托某一个人帮我做一件事情,比如,我由于某些原因不能像小红表白,那么我请小明帮我去跟小红表白,那么我请小明帮我表白的这种行为,就叫做委托

A 请求 B 帮我获取或者传递的行为,就叫做委托

委托的声明方法:

//无返回值无参数委托的定义方法
public delegate void NoReturnPara();

无参数,无返回值方法:

public void DoNothing()
{
// 没有参数,没有返回值
}

给委托赋值的几种方式

//实例化委托,并传入方法
NoReturbNoPara noreturn = new NoReturbNoPara(this.DoNothing);
//LinqToObject
NoReturbNoPara noreturn = () => { };
//直接赋值
NoReturbNoPara noreturn = this.DoNothing;

//调用委托的方法

noreturn.Invoke()

上面展示的是委托的基本定义于使用方法,现在实际B/S项目中基本摒弃了这种写法,转而使用封装好的泛型委托来使用

使用方法:

//无返回值,无参数委托,不需要单独声明
Action act = this.DoNothing;
//无返回值,有参数委托,参数类型为泛型
Action<string> act = p => { };
//返回类型为string,参数类型为string的委托
Func<string,string> func = p => p; //返回类型为bool,参数类型为string的委托
Func<string,bool> func = p => p.Equals('');

下面写几个简单的demo演示一下

    /// <summary>
/// 扩展方法
/// </summary>
public static class DelegateExtend
{
/// <summary>
/// 模仿Linq的Where操作
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="scoure">数据源</param>
/// <param name="func">委托(自定义bool条件)</param>
/// <returns></returns>
public static IEnumerable<T> ExtWhere<T>(this IEnumerable<T> scoure, Func<T, bool> func)
{
//遍历数据源的数据
foreach (var item in scoure)
{
//请求委托完成条件的筛选返回bool
bool bResult = func(item);
//把通过筛选提交的数据源,返回出去
if (bResult)
{
yield return item;
}
}
}
}

下面来调用这个方法,看一下委托的具体使用方法

   /// <summary>
/// 实体模型
/// </summary>
public class Student
{
/// <summary>
/// ID
/// </summary>
public string Id { get; set; }
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
}
        //查询出所有数据
IEnumerable<Student> student = sql.QueryList<Student>();
//定义一个匿名方法,并赋值给委托
Func<Student, bool> func = delegate(Student s)
{
//自定义代码逻辑,返回bool类型
return s.Id.Equals("");
};
//传入委托
IEnumerable<Student> list = student.ExtWhere(func);        //第二种方法,使用linq语法(自定义逻辑)
IEnumerable<Student> list1 = student.ExtWhere(p => p.Id.Equals(""));

上面就是一个简单但很常见的委托使用场景

从侧面理解一下这段代码,

ExtWhere 是我要做的一件事情,但这件事情里面我需要一个bool类型的返回结果,那么我委托func去帮我获取到这个bool类型的结果

我刚开始的时候,对委托的理解觉得很困难,总感觉晕晕的,但是自己没事多练习练习之后,就会很好理解了

上面的demo很好的解释了使用委托的好处

解耦:抽出自定义逻辑,保留相同的逻辑,使代码分离

最大限度的简化代码:解耦的同时,又减少了代码量(自定义逻辑,可以避免相同逻辑的代码重复)

.net 委托的使用方法以及使用委托的好处的更多相关文章

  1. .net 多播委托的使用方法以及场景,更简单的观察者模式

    首先来说一下什么是多播委托 多播委托就是在委托里定义一个或者多个方法的一个集合 使用方法: public Action actList; //添加方法 public void AddActionMet ...

  2. 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...

  3. 委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

    引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录 ...

  4. 转帖:用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树 这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托 ...

  5. 从委托、匿名方法到Lambda

    前面讲过委托的知识,本次由委托过渡到Lambda表达式,更易于理解. class Program { static void Main(string[] args) { , , , }; ProcAr ...

  6. C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法

    使用C#实现加减乘除算法经常被用作新手练习.本篇来分别体验通过委托.接口.匿名方法.泛型委托来实现. 使用委托实现 加减乘除拥有相同的参数个数.类型和返回类型,首先想到了使用委托实现. //创建一个委 ...

  7. C# 匿名委托、匿名方法、匿名对象、Lambda表达式

    一.匿名类型可通过使用 new 运算符和对象初始值创建匿名类型.示例:var v = new { Name = "Micro", Message = "Hello&quo ...

  8. 委托、匿名方法、Lambda表达式的演进

    摘自:"http://www.cnblogs.com/eagle1986/archive/2012/01/19/2327358.html 假设给我们一个泛型对象List<T>,T ...

  9. C# 委托简单使用方法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

随机推荐

  1. 白话图解HTTPS原理

        [前言]最近看过几篇文章,内容是关于"全民HTTPS"的.为什么HTTPS,突然会受到如此多业内人士的青睐呢?HTTPS究竟是什么呢?它与HTTP又有怎样的区别呢? 带着这 ...

  2. Cs Round#54 D Spanning Trees

    题意:构造一张N个结点无重边.无自环的无向图.使得其最小生成树和最大生成树共享K条边. 样例一很具有启发性: 当K!=0时,我们可以先构造出一条链,链的长度为n-k的链,作为最小生成树的一部分,之后由 ...

  3. NOIP2016提高组初赛(1)

    一.选择题 6.后缀表达式,使用二叉树来求解,正常情况下的表达式a*(b+c)- d为中序遍历的二叉树. 即 若转换为后缀表达式(左右根)则为abc+*d- 14.代数字进去,多试几遍: 三.问题求解 ...

  4. Python爬虫(十三)_案例:使用XPath的爬虫

    本篇是使用XPath的案例,更多内容请参考:Python学习指南 案例:使用XPath的爬虫 现在我们用XPath来做一个简单的爬虫,我们尝试爬取某个贴吧里的所有帖子且将该帖子里每个楼层发布的图片下载 ...

  5. PHP中的会话控制

    了解HTTP(超文本传输协议)可以知道,它采用请求与响应的模式,最大的特点就是无连接无状态. 无连接:每次连接仅处理一个客户端的请求,得到服务器响应后,连接就结束了 无状态:每个请求都是独立的,服务器 ...

  6. vue-cli 安装失败Failed to download repo vuejs-templates/webapck-simple: Response code 404 (Not Found)

    新学习vue的萌新们经常会遇到各种各样的坑.例如上面这个报错.这个一般是命令行面板写错单词导致. 正确:vue init webpack-simple .(注意"."点,指当前目录 ...

  7. Excel大写和小写转换函数

    Excel中的大写和小写转换函数 (1).转换为所有小写字母:lower函数 (2).转换为所有大写字母:upper函数 (3).转换为首字母大写,其余小写字母:proper函数 三种函数的使用方式. ...

  8. ORA-16032: parameter LOG_ARCHIVE_DEST_3 destination string cannot be translated问题处理过程

    1,现象是oracle启动报错例如以下: SQL> startup ORA-16032: parameter LOG_ARCHIVE_DEST_3 destination string cann ...

  9. [基础规范]JavaBeans规范

    本文来自维基百科:http://en.wikipedia.org/wiki/JavaBeans#JavaBean_conventions JavaBeans是Java语言中能够反复使用的软件组件,它们 ...

  10. 【Sqlsever系列】日期和时间

    1   概述 本文将集合MSDN简要概述Sqlserver中日期和时间函数. 2   具体内容 2.1  date and time data types 2.2  日期和时间功能 3   参考文献 ...