目录

  • 委托、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、事件相关推荐

  1. java疯狂讲义第八章-集合

    8. java疯狂讲义第八章-集合 Java 集合就像一种容器, 可以把多个对象(实际上是对象的引用,但习惯上都称对象) "丢进"该容器中. java集合分为Set.List.Qu ...

  2. IDEA报错解决:Error:(33, 35) java: -source 7 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式)

    晚上在用IDEA的时候遇到了报错: Error:(33, 35) java: -source 7 中不支持 lambda 表达式(请使用 -source 8 或更高版本以启用 lambda 表达式) ...

  3. java 增量编译_java增量构建关于lambda表达式的问题

    项目需要做java增量构建和部署.基本方案很简单. 构建:通过git diff拿到方法体变化的java类,绕过maven,直接使用同版本的javac编译出class文件. 部署:基于java-inst ...

  4. Java类加载机制:双亲委托模型

    Java类加载机制:双亲委托模型 前言(废话) 一如既往,这篇博客是我极为浅显的理解,仅仅是我记录我自己成长的一环而已.我以前听我老师说过,什么是进步,进步就是当你三个月后重新再看自己的代码,发现那就 ...

  5. java委托事件与观察者模式_多播委托与观察者模式联合使用,以及委托与事件的区别...

    首先我们先看一下多播委托: 使用委托时,首先我们声明委托,委托语法一共有四种类型,分别时有参,无参,以及有无参数返回值. 1 public class DelegateShow //: System. ...

  6. c++ new 数组_用Java实现JVM第八章《数组和字符串》

    案例介绍 本章主要介绍如何实现让虚拟机处理数组和字符串,在虚拟机功能增强后,我们可以执行数组类型计算和输出字符串.本章需要新增实现数组指令:newarray.anewarray.arraylength ...

  7. 委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别...

    在"实现观察者模式(Observer Pattern)的2种方式"中,曾经通过接口的方式.委托与事件的方式实现过观察者模式.本篇体验使用Action实现此模式,并从中体验委托与事件 ...

  8. 0202年了,还没有用上Java函数式编程!!!——Lambda表达式

    0202年了,还没有用上Java函数式编程!!!--Lambda表达式 函数式编程是什么 命令式编程(Imperative) 声明式编程(Declarative) 函数式编程(Functional) ...

  9. 用通俗易懂的大白话搞明白Java里的函数式编程和Lambda表达式

    今天,用通俗易懂的大白话来彻底搞明白Java里的函数式编程和Lambda表达式 为什么引入函数式编程,lambda表达式? 大家都知道,JDK1.8引入了函数式编程,lambda表达式. 那有没有想过 ...

  10. 对C#下函数,委托,事件的一点理解!

    <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 今天一来是有点 ...

最新文章

  1. WPF wpf scrollviewer 触屏滚动 窗体弹跳
  2. 必须进行支持的游戏方可使用此功能_C#8.0 新增功能
  3. 蔡高厅老师 - 高等数学阅读笔记 - 03 - 极限(13、14、15、16、17)
  4. 三元运算符, @屏蔽错误运算符
  5. 多种方式创建 Entity Framework Core 上下文
  6. 除了自定义cell以为,还可以通过属性来控制cell线条的长度
  7. 简单的社区管理系统(Qt)
  8. 家庭局域网_看教程,自己搭建家庭监控系统!
  9. Redis总结笔记(总结自Redis开发与运维)
  10. Cisco(PacketTracer) - 三层交换机
  11. Activiti 设置工作代理人
  12. 关于身份证加密展示处理以及update table set cou=(select from ..)
  13. backdrop-filter filter
  14. 我的天空计算机音乐,我的天空(Acoustic Version)
  15. Android整合SQLite数据库进行基本的增删改查
  16. IntelliJ IDEA 为JAVA 项目添加lib
  17. 计算机等级证打字每分钟多少字才算合格?
  18. 性价比一直是数据仓库中唯一重要的东西
  19. sdnu oj 1319 Russian Roulette
  20. Mysql5.7安装3306端口报错问题解决方法

热门文章

  1. 用计算机玩游戏的视频教程,让桌面上同时操作游戏和显示视频的技巧-电脑教程...
  2. vue全局引入openlayers_vue+openlayers绘制省市边界线
  3. ubuntu上安装drcom
  4. 构建具有丰富功能的交互式 Kiosk
  5. Adversarial Logit Pairing_CSDN
  6. 最全面的 Fiddler 教程讲解
  7. Oracle查询列重命名问题
  8. vue树形权限菜单_vue树形菜单
  9. Cura Engine 源码解析:Settings
  10. php微信公众号消息推送