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");
}
}
在这个示例中,我们首先声明了两个方法,然后声明了两个委托变量del1
和del2
分别指向了这两个方法。我们使用“+=”运算符将这两个委托合并到一个多播委托变量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表达式声明并实例化了两个委托变量add
和subtract
。add
委托执行加法,subtract
委托执行减法并返回相应的结果。
Lambda表达式的语法结构是(parameters) => expression
,其中parameters
表示Lambda表达式的参数列表,可以有一个或多个参数,如果没有参数,则使用空括号()
;expression
表示Lambda表达式的主体,可以是任何可执行的语句或代码块。
Lambda表达式的主体可以是一个语句,也可以是一个代码块。如果Lambda表达式的主体是一个语句,则可以省略花括号,否则必须使用花括号来定义代码块。
总结
本文介绍了C#中的委托、匿名函数和Lambda表达式的基础知识。委托是一种类型,它可以存储指向方法的引用,常用于实现回调方法、事件处理程序等。匿名函数和Lambda表达式为实现委托提供了更简单的语法规则。Lambda表达式可以用于实现单行或多行函数,这使得代码更加简洁易读,提高了代码的可维护性和可重用性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#基础知识—委托,匿名函数,lambda - Python技术站