【从Java转C#】第八章:委托、lambda、事件

简介: 【从Java转C#】第八章:委托、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;


相关文章
|
6月前
|
安全 Java API
Java中的Lambda表达式:简洁与功能的结合
Java中的Lambda表达式:简洁与功能的结合
504 211
|
4月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
447 8
|
8月前
|
SQL JSON 安全
Java 8 + 中 Lambda 表达式与 Stream API 的应用解析
摘要:本文介绍了Java 8+核心新特性,包括Lambda表达式与Stream API的集合操作(如过滤统计)、函数式接口的自定义实现、Optional类的空值安全处理、接口默认方法与静态方法的扩展能力,以及Java 9模块化系统的组件管理。每个特性均配有典型应用场景和代码示例,如使用Stream统计字符串长度、Optional处理Map取值、模块化项目的依赖声明等,帮助开发者掌握现代Java的高效编程范式。(150字)
169 1
|
10月前
|
JavaScript 前端开发 Java
【Java进阶】详解JavaScript事件
总的来说,JavaScript事件是JavaScript交互设计的核心,理解和掌握JavaScript事件对于编写高效、响应式的网页应用至关重要。
206 15
|
10月前
|
存储 机器学习/深度学习 监控
如何监控员工的电脑——基于滑动时间窗口的Java事件聚合算法实现探析​
在企业管理场景中,如何监控员工的电脑操作行为是一个涉及效率与合规性的重要课题。传统方法依赖日志采集或屏幕截图,但数据量庞大且实时性不足。本文提出一种基于滑动时间窗口的事件聚合算法,通过Java语言实现高效、低资源占用的监控逻辑,为如何监控员工的电脑提供一种轻量化解决方案。
350 3
|
11月前
|
SQL Rust Java
怎么理解Java中的lambda表达式
Lambda表达式是JDK8引入的新语法,用于简化匿名内部类的代码写法。其格式为`(参数列表) -&gt; { 方法体 }`,适用于函数式接口(仅含一个抽象方法的接口)。通过Lambda表达式,代码更简洁灵活,提升Java的表达能力。
243 4
|
Java 开发者 Spring
java springboot监听事件和处理事件
通过上述步骤,开发者可以在Spring Boot项目中轻松实现事件的发布和监听。事件机制不仅解耦了业务逻辑,还提高了系统的可维护性和扩展性。掌握这一技术,可以显著提升开发效率和代码质量。
381 33
|
10月前
|
Java 编译器 API
Java Lambda 表达式:以 Foo 接口为例深入解析
本文深入解析了 Java 8 中 Lambda 表达式的用法及其背后的函数式接口原理,以 `Foo` 接口为例,展示了如何通过简洁的 Lambda 表达式替代传统匿名类实现。文章从 Lambda 基本语法、函数式接口定义到实际应用层层递进,并探讨默认方法与静态方法的扩展性,最后总结常见误区与关键点,助你高效优化代码!
254 0
|
Java 开发者 Spring
java springboot监听事件和处理事件
通过上述步骤,开发者可以在Spring Boot项目中轻松实现事件的发布和监听。事件机制不仅解耦了业务逻辑,还提高了系统的可维护性和扩展性。掌握这一技术,可以显著提升开发效率和代码质量。
465 13