【从Java转C#】第八章:委托、lambda、事件
目录
- 委托、lambda表达式、事件
- 委托【Delegate】
- 简介
- 声明委托
- 实例化委托
- Action 和 Func
- Action:表示引用一个 void 的方法
- Func:允许调用带返回类型的方法
- 多播委托【必须返回void】
- Lambda表达式【与委托存在】
委托、lambda表达式、事件
委托【Delegate】
简介
C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。
委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。
声明委托
委托声明决定了可由该委托引用的方法。委托可指向一个与其具有相同标签的方法。
例如,假设有一个委托:
public delegate int MyDelegate (string s);
表示返回值为int类型,参数仅有一个为字符串的委托
实例化委托
一旦声明了委托类型,委托对象必须使用 new 关键字来创建,且与一个特定的方法有关。当创建委托时,传递到 new 语句的参数就像方法调用一样书写,但是不带有参数。例如:
class Program{public delegate int Dal(int x, int y);static void Main(){Program pro = new Program();Dal dal = new Dal(pro.swap);dal.Invoke(1, 2);Console.ReadLine();}public int swap(int x, int y){Console.WriteLine("11");return 2;}}
Action 和 Func
Action:表示引用一个 void 的方法
Calculator ca = new Calculator();
Action action = new Action(ca.Report);class Calculator{public void Report(){Console.WriteLine("I HAVE 3 METHODS");}public int Add(int a, int b){int result = a + b; return result;}public int Sub(int a, int b){int result = a - b; return result;}}
Func:允许调用带返回类型的方法
Func<int, int, int> func1 = new Func<int, int, int>(ca.Add);
Console.WriteLine(func1.Invoke(1, 2)); // 调用加法
class Calculator{public void Report(){Console.WriteLine("I HAVE 3 METHODS");}public int Add(int a, int b){int result = a + b; return result;}public int Sub(int a, int b){int result = a - b; return result;}}
多播委托【必须返回void】
class Program{static void Main(){Calculator ca = new Calculator();Action action1 = ca.Report1;Action action2 = ca.Report2;Action action3 = ca.Report3;Action action = action1 + action2 + action3;action();Console.ReadLine();}}class Calculator{public void Report1(){Console.WriteLine("I HAVE 1 METHODS");}public void Report2(){Console.WriteLine("I HAVE 2 METHODS");}public void Report3(){Console.WriteLine("I HAVE 3 METHODS");}}
Lambda表达式【与委托存在】
delegate委托
delegate int Trantformer(int i); Trantformer sqr = x => x * fation; Console.WriteLine(sqr(3)); // 30
Action委托
Action<int, int> action = (x, y) => Console.WriteLine(x * y);
Func委托
Func<int, int, int> func =(int x, int y) => x * y;
【从Java转C#】第八章:委托、lambda、事件相关推荐
- java疯狂讲义第八章-集合
8. java疯狂讲义第八章-集合 Java 集合就像一种容器, 可以把多个对象(实际上是对象的引用,但习惯上都称对象) "丢进"该容器中. java集合分为Set.List.Qu ...
- IDEA报错解决:Error:(33, 35) java: -source 7 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式)
晚上在用IDEA的时候遇到了报错: Error:(33, 35) java: -source 7 中不支持 lambda 表达式(请使用 -source 8 或更高版本以启用 lambda 表达式) ...
- java 增量编译_java增量构建关于lambda表达式的问题
项目需要做java增量构建和部署.基本方案很简单. 构建:通过git diff拿到方法体变化的java类,绕过maven,直接使用同版本的javac编译出class文件. 部署:基于java-inst ...
- Java类加载机制:双亲委托模型
Java类加载机制:双亲委托模型 前言(废话) 一如既往,这篇博客是我极为浅显的理解,仅仅是我记录我自己成长的一环而已.我以前听我老师说过,什么是进步,进步就是当你三个月后重新再看自己的代码,发现那就 ...
- java委托事件与观察者模式_多播委托与观察者模式联合使用,以及委托与事件的区别...
首先我们先看一下多播委托: 使用委托时,首先我们声明委托,委托语法一共有四种类型,分别时有参,无参,以及有无参数返回值. 1 public class DelegateShow //: System. ...
- c++ new 数组_用Java实现JVM第八章《数组和字符串》
案例介绍 本章主要介绍如何实现让虚拟机处理数组和字符串,在虚拟机功能增强后,我们可以执行数组类型计算和输出字符串.本章需要新增实现数组指令:newarray.anewarray.arraylength ...
- 委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别...
在"实现观察者模式(Observer Pattern)的2种方式"中,曾经通过接口的方式.委托与事件的方式实现过观察者模式.本篇体验使用Action实现此模式,并从中体验委托与事件 ...
- 0202年了,还没有用上Java函数式编程!!!——Lambda表达式
0202年了,还没有用上Java函数式编程!!!--Lambda表达式 函数式编程是什么 命令式编程(Imperative) 声明式编程(Declarative) 函数式编程(Functional) ...
- 用通俗易懂的大白话搞明白Java里的函数式编程和Lambda表达式
今天,用通俗易懂的大白话来彻底搞明白Java里的函数式编程和Lambda表达式 为什么引入函数式编程,lambda表达式? 大家都知道,JDK1.8引入了函数式编程,lambda表达式. 那有没有想过 ...
- 对C#下函数,委托,事件的一点理解!
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 今天一来是有点 ...
最新文章
- WPF wpf scrollviewer 触屏滚动 窗体弹跳
- 必须进行支持的游戏方可使用此功能_C#8.0 新增功能
- 蔡高厅老师 - 高等数学阅读笔记 - 03 - 极限(13、14、15、16、17)
- 三元运算符, @屏蔽错误运算符
- 多种方式创建 Entity Framework Core 上下文
- 除了自定义cell以为,还可以通过属性来控制cell线条的长度
- 简单的社区管理系统(Qt)
- 家庭局域网_看教程,自己搭建家庭监控系统!
- Redis总结笔记(总结自Redis开发与运维)
- Cisco(PacketTracer) - 三层交换机
- Activiti 设置工作代理人
- 关于身份证加密展示处理以及update table set cou=(select from ..)
- backdrop-filter filter
- 我的天空计算机音乐,我的天空(Acoustic Version)
- Android整合SQLite数据库进行基本的增删改查
- IntelliJ IDEA 为JAVA 项目添加lib
- 计算机等级证打字每分钟多少字才算合格?
- 性价比一直是数据仓库中唯一重要的东西
- sdnu oj 1319 Russian Roulette
- Mysql5.7安装3306端口报错问题解决方法