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# Linq的Min()方法 – 返回序列中的最小值

    C#的Linq是一种强大的数据查询和操作工具,可以让程序员更加高效地使用各种数据源,其中Min()函数是Linq中常用的一个函数,接下来我们就来一步步讲解如何使用Min()函数。 Min()函数的简介 Min()是Linq中的一个聚合函数(Aggregation Function),可以用来在一组数据中找到最小值并返回。它可以用于各种类型的数据,包括整数、浮…

    C# 2023年4月19日
    00
  • C# WPF 建立无边框(标题栏)的登录窗口的示例

    下面是C#WPF建立无边框(标题栏)的登录窗口的完整攻略,包含两条示例。 1. 在XAML中设置窗口样式 我们可以在XAML文件中设置窗口的样式。首先,我们需要设置窗口的ResizeMode属性为NoResize,这将禁用窗口的缩放功能。接着,我们可以设置窗口Chrome样式为None,这将清除窗口的默认边框,而且我们需要手动添加窗口的标题栏和关闭按钮。 &…

    C# 2023年5月15日
    00
  • Global.cs中自动获取未处理的异常

    首先,我们需要了解.NET框架的全局异常处理机制。在.NET中,我们可以通过捕获未处理的异常来处理程序运行时的错误,以便更好地改善用户体验。而要实现这一机制,我们可以利用Global.cs文件来自动获取未处理的异常。 具体实现方式如下: 在Global.cs文件中重写Application_Error方法。在这个方法中,我们可以用try-catch语句捕获未…

    C# 2023年5月15日
    00
  • C#中时间类的使用方法详解

    C#中时间类的使用方法详解 C#中有很多时间类,但最常用的是 DateTime 类,它可以表示一个特定的日期和时间。以下是 DateTime 类的使用方法的详细攻略。 DateTime 类的构造函数 DateTime 类有多个构造函数,其中一些最重要的构造函数如下所示: DateTime(): 创建一个 DateTime 对象,它的值是当前日期和时间。 Da…

    C# 2023年5月31日
    00
  • c#中LINQ的基本用法(二)

    下面是关于“c#中LINQ的基本用法(二)”的完整攻略: 标题 在 markdown 中,标题可以通过一个或多个 # 符号来表示,例如: # 一级标题 ## 二级标题 ### 三级标题 概述 LINQ 是一种数据访问技术,可以帮助我们以一种统一的方式处理各种类型的数据,包括 .NET 对象、SQL 数据、XML、ADO.NET 数据集等。在C#中, LINQ…

    C# 2023年5月31日
    00
  • C#中使用Spire.doc对word的操作方式

    下面我就来为您详细讲解一下C#中使用Spire.doc对Word的操作方式。 什么是Spire.doc? Spire.doc for .NET 是一款专业的Word文档操作组件,它可以帮助开发者实现对Word文件的创建、读取、编辑、转换及打印等操作,而且具有很好的性能和稳定性。 Spire.doc的安装 首先,我们需要在官网下载Spire.Doc for .…

    C# 2023年6月1日
    00
  • 详解Unity使用ParticleSystem粒子系统模拟药水在血管中流动(粒子碰撞)

    详解Unity使用ParticleSystem粒子系统模拟药水在血管中流动(粒子碰撞) 简介 ParticleSystem是Unity中用于创建、模拟粒子系统的组件。在游戏中,我们可以使用ParticleSystem模拟火、烟、雨、雪等特效。本文将介绍如何利用ParticleSystem模拟药水在血管中流动,以及如何实现粒子碰撞。 创建药水流动的效果 首先,…

    C# 2023年6月3日
    00
  • Unity3D在Preview中打印日志的方法

    Unity3D在Preview中打印日志的方法可以使用以下两种方式: 1. 使用Debug类中的方法 Debug类是Unity3D中最常用的用于打印日志的类之一。以下是在Preview中使用Debug类打印日志的步骤: 步骤1:在Unity3D编辑器中打开你的脚本文件 通常,你需要将这个脚本附加到一个游戏对象上,并且可以通过单击左上角的Play按钮在Edit…

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