C#基础委托回顾
C#基础委托回顾
前言
- 快忘记了。
委托的特点
- 委托类似于 C++ 函数指针,但它们是类型安全的。
- 委托允许将方法作为参数进行传递。
- 委托可用于定义回调方法。
- 委托可以链接在一起;例如,可以对一个事件调用多个方法。
- 方法不必与委托签名完全匹配。
- 委托是事件的基础。
用法
- 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;
}
- 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}");
}
- 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;
}
- predicate(bool型的泛型委托)
- 只能接受一个传入参数,返回值为bool类型
- 表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素
private static bool ProductGT10(Point p)
{
if (p.X * p.Y > 100000)
{
return true;
}
else
{
return false;
}
}
- Expression<Func<T,TResult>>是表达式
Expression<Func<int, int, int, int>> expr = (x, y, z) => (x + y) / z;
- 委托清理
- 示例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;
}
}
}
- 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#基础委托回顾的更多相关文章
- C#基础知识回顾-- 反射(3)
C#基础知识回顾-- 反射(3) 获取Type对象的构造函数: 前一篇因为篇幅问题因为篇幅太短被移除首页,反射这一块还有一篇“怎样在程序集中使用反射”, 其他没有什么可以写的了,前两篇主要是铺垫, ...
- C#基础知识回顾--线程传参
C#基础知识回顾--线程传参 在不传递参数情况下,一般大家都使用ThreadStart代理来连接执行函数,ThreadStart委托接收的函数不能有参数, 也不能有返回值.如果希望传递参数给执行函数, ...
- java基础知识回顾之---java String final类普通方法
辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /* * 按照面向对象的思想对字符串进行功能分类. * ...
- C#基础知识回顾-- 反射(1)
C#基础知识回顾-- 反射(1) 反射(reflection)是一种允许用户获得类型信息的C#特性.术语“反射”源自于它的工作方式: Type对象映射它所代表的底层对象.对Type对象进行查询可以 ...
- python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。
本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...
- JavaWeb开发技术基础概念回顾篇
JavaWeb开发技术基础概念回顾篇 第一章 动态网页开发技术概述 1.JSP技术:JSP是Java Server Page的缩写,指的是基于Java服务器端动态网页. 2.JSP的运行原理:当用户第 ...
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
- C++ 基础知识回顾总结
一.前言 为啥要写这篇博客?答:之前学习的C和C++相关的知识,早就被自己忘到一边去了.但是,随着音视频的学习的不断深入,和C/C++打交道的次数越来越多,看代码是没问题的,但是真到自己操刀去写一些代 ...
- scrapy实战1,基础知识回顾和虚拟环境准备
视频地址 https://coding.imooc.com/learn/list/92.html 一. 基础知识回顾 1. 正则表达式 1)贪婪匹配,非贪婪匹配 .*? 非贪婪 . ...
随机推荐
- Unity 捏脸整理及基于骨骼的捏脸功能实现
目前实现捏脸功能的方式主要有两种.一个是Blendshape(融合变形),一个是基于骨骼驱动的方式,通过修改骨骼矩阵(bindpose)来影响SkinMesh.这两种方式的最终原理都是在shader ...
- 如何通过get,set方法访问到父类的私有属性
刚学习继承的时候,总是会有这样的疑问. 子类继承父类时,会继承所有的非私有的属性和方法.那么在用set方法修改父类的私有属性时,怎么没有报空指针异常呢? 后来仔细想过这个问题,既然没有报空指针,那么在 ...
- Java PDF页面设置——页面大小、页边距、纸张方向、页面旋转
下面的示例将介绍通过Java编程来对PDF页面进行个性化设置的方法,包括设置页面大小.页边距.纸张方向.页面旋转等.这里有如下多种页面大小尺寸可供选择: 同时,设置文档内容旋转时,可支持如下角度进行内 ...
- 开发时候常用的js方法封装
1.判断是否是一个数组 function isArray(arr){ return Object.prototype.toString.call(arr) ==='[object Array]'; } ...
- GeoServer中sld文件的获取来源
众所周知,uDig是GeoServer的一个客户端,可以方便地可视化配置样式. QGIS行不行呢? 当然可以,双击图层名称,弹出图层属性对话框 在符号化(style)标签页选择样式导出即可. 参考博客 ...
- 全球排名第一的免费开源ERP Odoo 12产品发布会北京站开始报名
Odoo V12 产品(北京)发布会 暨企业数字化转型论坛 快速报名通道:http://odoochina.mikecrm.com/uG8nNu4 随着新版本Odoo 12的发布,开源智造(OSCG. ...
- 可能是最全面的G1学习笔记
引子 最近遇到很多朋友过来咨询G1调优的问题,我自己去年有专门学过一次G1,但是当时只是看了个皮毛,因此自己也有不少问题.总体来讲,对于G1我有几个疑惑,希望能够在这篇文章中得到解决. G1出现的初衷 ...
- Git 中 .gitignore 的配置语法
一.前言 在日常的开发中,当我们需要将一个项目提交到 Git 时,并不是所有的文件都需要提交,比如一些自动生成的文件,类似于 .idea 文件.class 文件等,这时候就可以使用.gitignore ...
- PXE安装windows系统,pxe-e55:ProxyDhcp service did not reply to request on port 4011
这个pxe-e55" 错误表示 pxe 客户端已向端口4011上的代理 dhcp 服务器发送请求, 但未收到答复.似乎只有在dhcp 服务器上设置了 dhcp 类标识符选项 #60, 但同一 ...
- 【XSS】对抗蠕虫 —— 如何让按钮不被 JS 自动点击
前言 XSS 自动点按钮有什么危害? 在社交网络里,很多操作都是通过点击按钮发起的,例如发表留言.假如留言系统有 XSS,用户中招后除了基本攻击外,还能进行传播 -- XSS 自动填入留言内容,并模拟 ...