C#基础委托回顾

前言
  • 快忘记了。
委托的特点
  • 委托类似于 C++ 函数指针,但它们是类型安全的。
  • 委托允许将方法作为参数进行传递。
  • 委托可用于定义回调方法。
  • 委托可以链接在一起;例如,可以对一个事件调用多个方法。
  • 方法不必与委托签名完全匹配。
  • 委托是事件的基础。

官网介绍

用法
  1. delegate
  • 至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型
  • 示例:
public delegate Int32 ComputeDelegate(Int32 a, Int32 b);
private static Int32 Compute(Int32 a, Int32 b)
{
return a + b;
} public delegate Int32 ComputeDelegate2(Int32 a, Int32 b);
//delegate参数
private static Int32 ReceiveDelegateArgsFunc(ComputeDelegate2 func)
{
return func(1, 2);
}
private static Int32 DelegateFunction(Int32 a, Int32 b)
{
return a + b;
}
  1. Action(无返回值的泛型委托)
  • Action可以接受0个至16个传入参数,无返回值
  • 示例:
public static void TestAction<T>(Action<T> action, T t)
{
action(t);
}
private static void Printf(string s)
{
Console.WriteLine($"3、{s}");
}
private static void Printf(int s)
{
Console.WriteLine($"3、{s}");
}
  1. Func<T,TResult> 是有返回值的泛型委托
  • 封装一个具有一个参数并返回 TResult 参数指定的类型值的方法
  • public delegate TResult Func<in T, out TResult>(T arg)
  • 可以接受0个至16个传入参数,必须具有返回值
public static int TestFunc<T1, T2>(Func<T1, T2, int> func, T1 a, T2 b)
{
return func(a, b);
}
private static int Fun(int a, int b)
{
return a + b;
}
  1. predicate(bool型的泛型委托)
  • 只能接受一个传入参数,返回值为bool类型
  • 表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素
private static bool ProductGT10(Point p)
{
if (p.X * p.Y > 100000)
{
return true;
}
else
{
return false;
}
}
  1. Expression<Func<T,TResult>>是表达式
 Expression<Func<int, int, int, int>> expr = (x, y, z) => (x + y) / z;
  1. 委托清理
  • 示例1:循环依次循环
public ComputeDelegate OnDelegate;
public void ClearDelegate()
{
while (OnDelegate != null)
{
OnDelegate -= OnDelegate;
}
}
  • 示例2:利用GetInvocationList方法
static void Main(string[] args)
{
Program2 test = new Program2();
if (test.OnDelegate != null)
{
Delegate[] dels = test.OnDelegate.GetInvocationList();
for (int i = 0; i < dels.Length; i++)
{
test.OnDelegate -= dels[i] as ComputeDelegate;
}
}
}
  1. sample
static void Main(string[] args)
{
ComputeDelegate computeDelegate = new ComputeDelegate(Compute);
Console.WriteLine($"1、sum:{computeDelegate(1, 2)}"); ComputeDelegate2 computeDelegate2 = new ComputeDelegate2(DelegateFunction);
Console.WriteLine($"2、sum:{ReceiveDelegateArgsFunc(computeDelegate2)}"); TestAction<String>(Printf, "action");
TestAction<Int32>(Printf, 12);
TestAction<String>(x => { Printf(x); }, "hello action!");//Lambda Console.WriteLine($"4、{ TestFunc(Fun, 1, 2)}"); Point[] points = {
new Point(100, 200),
new Point(150, 250),
new Point(250, 375),
new Point(275, 395),
new Point(295, 450) };
Point first = Array.Find(points, ProductGT10);
Console.WriteLine($"5、 X = {first.X}, Y = {first.Y}"); Expression<Func<int, int, int, int>> expr = (x, y, z) => (x + y) / z;
Console.WriteLine($"6、{expr.Compile()(1, 2, 3)}"); Console.WriteLine("Press any key...");
Console.ReadKey();
}

官网介绍

C#委托介绍

Expression

C#基础委托回顾的更多相关文章

  1. C#基础知识回顾-- 反射(3)

    C#基础知识回顾-- 反射(3)   获取Type对象的构造函数: 前一篇因为篇幅问题因为篇幅太短被移除首页,反射这一块还有一篇“怎样在程序集中使用反射”, 其他没有什么可以写的了,前两篇主要是铺垫, ...

  2. C#基础知识回顾--线程传参

    C#基础知识回顾--线程传参 在不传递参数情况下,一般大家都使用ThreadStart代理来连接执行函数,ThreadStart委托接收的函数不能有参数, 也不能有返回值.如果希望传递参数给执行函数, ...

  3. java基础知识回顾之---java String final类普通方法

    辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /*     * 按照面向对象的思想对字符串进行功能分类.     *      ...

  4. C#基础知识回顾-- 反射(1)

    C#基础知识回顾-- 反射(1)   反射(reflection)是一种允许用户获得类型信息的C#特性.术语“反射”源自于它的工作方式: Type对象映射它所代表的底层对象.对Type对象进行查询可以 ...

  5. python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

    本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...

  6. JavaWeb开发技术基础概念回顾篇

    JavaWeb开发技术基础概念回顾篇 第一章 动态网页开发技术概述 1.JSP技术:JSP是Java Server Page的缩写,指的是基于Java服务器端动态网页. 2.JSP的运行原理:当用户第 ...

  7. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  8. C++ 基础知识回顾总结

    一.前言 为啥要写这篇博客?答:之前学习的C和C++相关的知识,早就被自己忘到一边去了.但是,随着音视频的学习的不断深入,和C/C++打交道的次数越来越多,看代码是没问题的,但是真到自己操刀去写一些代 ...

  9. scrapy实战1,基础知识回顾和虚拟环境准备

        视频地址 https://coding.imooc.com/learn/list/92.html   一. 基础知识回顾     1. 正则表达式 1)贪婪匹配,非贪婪匹配 .*? 非贪婪 . ...

随机推荐

  1. [PHP]日志处理error_log()函数和配置使用

    1.error_log($message,$message_type,$destination,$extra_headers)函数, 2.message_type 是0,发送信息到php.ini配置的 ...

  2. 小程序 wepy框架 + iview-weapp的用法

    最近在弄wepy的时候在想有没有什么ui比较合适一点的wepy的,也是在网上看了好久发现iview还不错.引用简单,上手超快,组件绚丽!当然,这里还介绍下微信官方建议的框架也是和不错的,有需要的可以看 ...

  3. vue 设计一个倒计时秒杀的组件

    简介: 倒计时秒杀组件在电商网站中层出不穷  不过思路万变不离其踪,我自己根据其他资料设计了一个vue版的 核心思路:1.时间不能是本地客户端的时间  必须是服务器的时间这里用一个settimeout ...

  4. 土旦:关于display:flex碰上white-space nowrap 影响布局的问题

    背景,做一个前面图片宽度固定,后面宽度自适应,使用到了flex布局,但是想让后面div里文字不换行,超出以点点表示时,这时布局就乱了,查了下,原来flex布局与white-space:nowrap有影 ...

  5. 如何通过免费开源的ERP Odoo打造企业全员营销整体解决方案

    应用场景的背景故事 在一些二级城市,往往线索的来源是通过企业当地口碑积累.熟人转介绍等线下的方式为主,利用互联网的模式往往很难奏效,企业面临的第一个问题就是如何把握线索真实的来源介绍的问题.在这个问题 ...

  6. Iterm2/Mac自带终端工具快速进入你想进入的虚拟机教程

    一.首先我们在终端本地要写一个登录的脚本,eg: 当然首先要touch login.sh 啦,下面就是脚本文件,比较low,大神勿喷,会更炫酷写法的小伙伴可以自己参考这个思路写,不会的直接复制就好啦 ...

  7. python3 函数传参练习 全局变量与局部变量 的理解

    额 还是继续抄一边NLP第二条: 2.一个人不能控制另外一个人   一个人不能改变另外一个人,一个人只能改变自己. 每个人的信念,价值观,规条系统只对本人有效,不应强求别人接守. 改变自己,别人才会有 ...

  8. ZJOI2019一轮游记

    Preface 期待已久的省选终于开始了233,关于之前的一些内容,在ZJOI2019一轮停课刷题记录都可以找到,这里不再赘述 ZJOI2019,Bless All Day -1 今天难得有休息,昨晚 ...

  9. 又双叒叕换,微软这次换Edge了

    http://tech.sina.com.cn/it/2018-12-06/doc-ihmutuec6481129.shtml 其实两个月前跟一个微软的前同事聊天已经听说过微软要基于Chromiun来 ...

  10. wtf!rds数据同步居然出问题了--菜鸟db的数据修复历程

    由于一次上线操作的数据变更太多,导致执行时间很长! 由于做手动主从关系,所以操作落在了主库上. 由于主从关系不是对整个库的操作,所以在有表新增的地方,添加了dts新的同步关系. db变更完成后,就发布 ...