c#基础知识—委托,匿名函数,lambda

C#基础知识:委托、匿名函数、Lambda表达式

什么是委托?

C#中的委托是一种类型,它可以存储指向方法的引用。委托类似于C/C++语言中的函数指针,它用于在C#中实现回调方法、事件处理程序等。

委托的定义

在C#中,委托定义如下:

public delegate void DelegateName(parameters);

其中,DelegateName表示委托名称,void表示可以指向的方法的返回类型,parameters表示方法的参数列表。

委托的使用

以下示例演示了如何使用委托:

using System;

public delegate string GetFullname(string firstName, string lastName);

public class Person
{
    private string firstName;
    private string lastName;

    public Person(string firstName, string lastName)
    {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public string GetFirstName()
    {
        return this.firstName;
    }

    public string GetLastName()
    {
        return this.lastName;
    }

    public static string GetFullnameStatic(string firstName, string lastName)
    {
        return firstName + " " + lastName;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Person person = new Person("John", "Doe");

        // 声明一个委托并将其设置为指向Person类的GetFullname方法
        GetFullname fullnameDelegate = person.GetFullname;

        // 调用委托
        string fullname1 = fullnameDelegate(person.GetFirstName(), person.GetLastName());
        Console.WriteLine(fullname1);

        // 使用静态方法作为委托的目标方法
        fullnameDelegate = Person.GetFullnameStatic;
        string fullname2 = fullnameDelegate(person.GetFirstName(), person.GetLastName());
        Console.WriteLine(fullname2);

        Console.ReadKey();
    }
}

在上面的示例中,GetFullname是一个自定义委托类型,用于存储指向Person类的GetFullName方法的引用。通过声明并实例化GetFullName委托,我们可以在fullnameDelegate变量中存储Person对象的GetFullName方法的引用。随后,我们可以调用委托来执行存储的方法。

委托的多播

C#中的委托可以存储多个方法的引用,这种结构称为“多播委托”。多播委托既可以通过“+=”运算符添加方法引用,也可以通过“-=”运算符移除方法引用。以下示例演示了如何使用多播委托:

using System;

public delegate void MyDelegate();

class Program
{
    static void Main(string[] args)
    {
        MyDelegate del1 = Method1;
        MyDelegate del2 = Method2;

        MyDelegate del3 = del1 + del2; // 多播委托

        del3(); // 调用委托,依次执行已添加的两个方法

        del3 -= del1; // 移除del1指向的方法

        del3(); // 调用委托,只执行一个方法

        Console.ReadKey();
    }

    static void Method1()
    {
        Console.WriteLine("Method 1");
    }

    static void Method2()
    {
        Console.WriteLine("Method 2");
    }
}

在这个示例中,我们首先声明了两个方法,然后声明了两个委托变量del1del2分别指向了这两个方法。我们使用“+=”运算符将这两个委托合并到一个多播委托变量del3中。随后,调用del3()方法时,它会依次执行两个方法。我们可以使用“-=”运算符移除del1指向的方法,最终的del3()方法就只会执行Method2方法。

什么是匿名函数?

C#中的匿名函数是没有名称的函数,它们通常用于在局部上下文中以内联方式编写委托。

lambda表达式

lambda表达式是匿名函数的一种形式,它表示一个可执行的代码块,可以传递给某些方法或存储在变量中。在C#中,lambda表达式由以下几部分组成:

(parameters) => expression

其中,parameters表示用于传递到lambda表达式中的参数列表,=>(读作“goes to”)表示分隔符,expression表示lambda表达式的主体。

匿名函数和lambda表达式的使用示例

using System;

public delegate void MyDelegate(string name);

class Program
{
    static void Main(string[] args)
    {
        MyDelegate sayHello1 = delegate(string name)
        {
            Console.WriteLine($"Hello, {name}!");
        };

        MyDelegate sayHello2 = (string name) =>
        {
            Console.WriteLine($"Hello, {name}!");
        };

        MyDelegate sayHello3 = (name) => Console.WriteLine($"Hello, {name}!");

        sayHello1("John");
        sayHello2("Mary");
        sayHello3("Tom");

        Console.ReadKey();
    }
}

在这个示例中,我们定义了一个自定义委托类型MyDelegate。在Main方法中,我们声明并实例化了三个MyDelegate委托,每个委托使用不同的语法结构来实现相同的功能。第一个委托使用了匿名方法,第二个和第三个委托使用了lambda表达式。所有委托将要执行的操作都是输出一个问候语。

什么是Lambda表达式?

前面说了许多Lambda表达式,这里进一步深入讲解

Lambda表达式允许我们使用更简短的语法来定义委托。Lambda表达式可以传递到支持委托的方法中,以便定义回调方法或实现事件处理程序等。

以下示例演示了如何使用Lambda表达式:

using System;

public delegate int Calculate(int x, int y);

class Program
{
    static void Main(string[] args)
    {
        Calculate add = (x, y) => x + y;
        Calculate subtract = (x, y) => x - y;

        int result1 = add(3, 4); // 在Lambda表达式中执行加法
        Console.WriteLine(result1);

        int result2 = subtract(5, 2); // 在Lambda表达式中执行减法
        Console.WriteLine(result2);

        Console.ReadKey();
    }
}

在上面的示例中,我们声明了一个Calculate委托用于存储一个可接受两个整数参数且返回一个整数的方法。我们使用Lambda表达式声明并实例化了两个委托变量addsubtractadd委托执行加法,subtract委托执行减法并返回相应的结果。

Lambda表达式的语法结构是(parameters) => expression,其中parameters表示Lambda表达式的参数列表,可以有一个或多个参数,如果没有参数,则使用空括号()expression表示Lambda表达式的主体,可以是任何可执行的语句或代码块。

Lambda表达式的主体可以是一个语句,也可以是一个代码块。如果Lambda表达式的主体是一个语句,则可以省略花括号,否则必须使用花括号来定义代码块。

总结

本文介绍了C#中的委托、匿名函数和Lambda表达式的基础知识。委托是一种类型,它可以存储指向方法的引用,常用于实现回调方法、事件处理程序等。匿名函数和Lambda表达式为实现委托提供了更简单的语法规则。Lambda表达式可以用于实现单行或多行函数,这使得代码更加简洁易读,提高了代码的可维护性和可重用性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#基础知识—委托,匿名函数,lambda - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • C# Path.GetTempPath – 获取系统的临时文件目录

    下面就详细讲解一下C#的Path.GetTempPath方法。 Path.GetTempPath方法的作用 Path.GetTempPath方法用于获取当前操作系统的临时文件夹路径。在该路径中,应用程序可以创建、读取和删除临时文件,以满足临时保存数据的需求。 Path.GetTempPath方法的使用方法 方法签名 首先,我们需要了解该方法的签名: publ…

    C# 2023年4月19日
    00
  • C#动态创建Access数据库及密码的方法

    下面我将详细讲解“C#动态创建Access数据库及密码的方法”的完整攻略。 简介 Access数据库是一种常见的数据库类型,很多应用程序需要使用它来存储数据。在C#中,我们可以使用ADO.NET来连接Access数据库,而有时候我们需要动态地创建数据库,以及为数据库添加密码保护。接下来,我会给出动态创建Access数据库及密码的完整攻略。 步骤 1. 引用必…

    C# 2023年6月2日
    00
  • C#实现Base64编码与解码及规则

    C# 实现 Base64 编码与解码 Base64 编码将二进制数据转换成 ASCII 字符。C# 中可以通过 System.Convert 类实现 Base64 编码和解码。 Base64 编码 byte[] inputArray = System.Text.Encoding.UTF8.GetBytes("Hello World!");…

    C# 2023年6月6日
    00
  • C# File.WriteAllText – 将字符串写入文件

    File.WriteAllText 方法的作用是将指定字符串写入指定文件中,如果该文件已经存在则覆盖原有内容。该方法属于System.IO命名空间的成员方法,可直接调用。 使用方法: File.WriteAllText(string path, string contents); 其中path参数表示文件路径,相对路径或绝对路径均可;contents参数表示…

    C# 2023年4月19日
    00
  • ASP.NET Core 3.0迁移的完美避坑指南

    ASP.NET Core 3.0迁移的完美避坑指南 ASP.NET Core 3.0是一个重大的版本更新,其中包含了许多新功能和改进。但是,由于这些更改,迁移现有的ASP.NET Core应用程序可能会遇到一些问题。在本攻略中,我们将提供一些有用的提示和技巧,以帮助您成功地将现有的ASP.NET Core应用程序迁移到3.0版本。 1. 更新NuGet包 在…

    C# 2023年5月16日
    00
  • C#判断字符串中内容是否为纯数字的详细教程

    下面是关于如何判断字符串中内容是否为纯数字的详细教程: 步骤一:准备工作 在C#中,我们可以使用int.TryParse()方法来判断一个字符串是否为纯数字,该方法会尝试将指定的字符串转换为数字类型,如果转换成功,则返回true,否则返回false。 步骤二:判断字符串是否为纯数字 接下来,我们可以编写代码来判断字符串是否为纯数字: string input…

    C# 2023年6月8日
    00
  • 深入分析C#异步编程详解

    深入分析C#异步编程详解攻略 什么是异步编程 异步编程是一种在执行操作时不阻塞后续操作的编程模式。在异步编程中,当一个操作被提交时,它的控制被立即返回给调用者,而不需要等待操作的完成。当操作完成后,调用者可以通过回调或轮询的方式获取操作结果。在C#中,异步编程主要通过异步方法和任务的方式实现。 异步编程的优势 异步编程有以下优势: 提高程序的资源利用率 减少…

    C# 2023年6月3日
    00
  • C#中Socket通信用法实例详解

    C#中Socket通信用法实例详解 1. 简介 本文将详细讲解 C#中 Socket 通信的用法以及实例。Socket 是即插即用的通用数据交换接口,常用于不同操作系统、不同软件之间的通信。在 C# 中,通过 System.Net.Sockets 命名空间下的实现,可以轻松实现 Socket 通信,可以方便地实现 TCP、UDP 等协议。 2. 实例1:C#…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部