【从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;


相关文章
|
19天前
|
C#
c# Gridview 点击checkbox 触发的事件
c# Gridview 点击checkbox 触发的事件
|
1天前
|
Java 编译器 API
Java基础教程(17)-Java8中的lambda表达式和Stream、Optional
【4月更文挑战第17天】Lambda表达式是Java 8引入的函数式编程特性,允许函数作为参数或返回值。它有简洁的语法:`(parameters) -> expression 或 (parameters) ->{ statements; }`。FunctionalInterface注解用于标记单方法接口,可以用Lambda替换。
|
3天前
|
Java 程序员 编译器
JavaSE&Java8 Lambda 表达式
JavaSE&Java8 Lambda 表达式
|
7天前
|
并行计算 Java 编译器
Java Lambda表达式简介
Java Lambda表达式简介
12 0
|
8天前
|
Java API
Java Lambda
Java Lambda
15 0
|
8天前
|
Java 开发者
探索 Java 的函数式接口和 Lambda 表达式
【4月更文挑战第19天】Java 中的函数式接口和 Lambda 表达式提供了简洁、灵活的编程方式。函数式接口有且仅有一个抽象方法,用于与 Lambda(一种匿名函数语法)配合,简化代码并增强可读性。Lambda 表达式的优点在于其简洁性和灵活性,常用于事件处理、过滤和排序等场景。使用时注意兼容性和变量作用域,它们能提高代码效率和可维护性。
|
11天前
|
分布式计算 Java API
Java 8新特性之Lambda表达式与Stream API
【4月更文挑战第16天】本文将介绍Java 8中的两个重要新特性:Lambda表达式和Stream API。Lambda表达式是Java 8中引入的一种新的编程语法,它允许我们将函数作为参数传递给其他方法,从而使代码更加简洁、易读。Stream API是Java 8中引入的一种新的数据处理方式,它允许我们以声明式的方式处理数据,从而使代码更加简洁、高效。本文将通过实例代码详细讲解这两个新特性的使用方法和优势。
|
17天前
|
Java 开发者
Java中的Lambda表达式:简洁、灵活的编程利器
在现代软件开发中,编写简洁、高效的代码是至关重要的。Java中的Lambda表达式为开发者提供了一种简洁、灵活的编程方式,使得代码更具可读性和可维护性。本文将探讨Lambda表达式的基本概念、语法结构以及在实际项目中的应用,以帮助读者更好地理解和运用这一强大的编程工具。
6 0
|
19天前
|
存储 Java API
java8新特性 lambda表达式、Stream、Optional
java8新特性 lambda表达式、Stream、Optional
|
19天前
|
C#
C# Dev解决gridview1_SelectionChanged和gridview1_RowCellClick事件触发两次等问题
C# Dev解决gridview1_SelectionChanged和gridview1_RowCellClick事件触发两次等问题
C# Dev解决gridview1_SelectionChanged和gridview1_RowCellClick事件触发两次等问题