在C#的语法体系中,=>符号被称为Lambda运算符,它主要承担两种完全不同的功能,分别是用于创建Lambda表达式,以及定义各类表达式体成员,这两种用法覆盖了日常开发中的很多常见场景。

=>符号的第一种用法:Lambda表达式
Lambda表达式是C#引入的一种匿名函数写法,它使用=>符号来分隔参数列表和表达式主体,相比传统的匿名方法写法更加简洁,常用于委托、LINQ查询等场景。
Lambda表达式的基本语法
Lambda表达式的通用语法格式为:(参数列表) => 表达式主体,当参数只有一个时,括号可以省略。如果表达式主体包含多条语句,需要使用大括号包裹,并且添加return语句返回结果。
Lambda表达式使用示例
下面通过几个常见的场景展示Lambda表达式的用法:
// 1. 无参数的Lambda表达式
Func<string> getGreeting = () => "Hello World";
Console.WriteLine(getGreeting()); // 输出 Hello World
// 2. 单个参数的Lambda表达式,省略括号
Func<int, int> square = x => x * x;
Console.WriteLine(square(5)); // 输出 25
// 3. 多个参数的Lambda表达式
Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(3, 4)); // 输出 7
// 4. 表达式主体包含多条语句的Lambda表达式
Func<int, int> calculate = x =>
{
int result = x * 2;
result += 10;
return result;
};
Console.WriteLine(calculate(5)); // 输出 20
// 5. 在LINQ查询中使用Lambda表达式
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();
// evenNumbers结果为 [2,4]
=>符号的第二种用法:表达式体成员
表达式体成员是C# 6.0及后续版本引入的语法特性,允许使用=>符号来定义类或结构体的成员,替代传统的语句体定义方式,让成员的代码更加简洁。
表达式体成员的适用场景
表达式体成员可以用于定义方法、属性、构造函数、终结器、索引器等各类成员,只要成员的逻辑可以用单个表达式表示,就可以使用这种写法。
表达式体成员使用示例
以下是不同成员使用表达式体定义的示例:
public class Student
{
// 1. 表达式体方法
public string Name { get; set; }
public int Age { get; set; }
// 传统方法定义
// public string GetInfo()
// {
// return $"姓名:{Name},年龄:{Age}";
// }
// 表达式体方法定义
public string GetInfo() => $"姓名:{Name},年龄:{Age}";
// 2. 表达式体属性
// 传统属性定义
// public bool IsAdult
// {
// get { return Age >= 18; }
// }
// 表达式体属性定义
public bool IsAdult => Age >= 18;
// 3. 表达式体构造函数
// 传统构造函数定义
// public Student(string name, int age)
// {
// Name = name;
// Age = age;
// }
// 表达式体构造函数定义
public Student(string name, int age) => (Name, Age) = (name, age);
// 4. 表达式体索引器
private string[] scores = new string[3];
// 传统索引器定义
// public string this[int index]
// {
// get { return scores[index]; }
// set { scores[index] = value; }
// }
// 表达式体索引器定义
public string this[int index]
{
get => scores[index];
set => scores[index] = value;
}
}
// 使用测试
var student = new Student("张三", 20);
Console.WriteLine(student.GetInfo()); // 输出 姓名:张三,年龄:20
Console.WriteLine(student.IsAdult); // 输出 True
student[0] = "90";
Console.WriteLine(student[0]); // 输出 90
两种用法的核心区别
虽然两种用法都使用=>符号,但核心逻辑有明显差异:
- Lambda表达式本质是匿名函数,用于快速定义一段可执行的代码逻辑,通常赋值给委托类型的变量,或者作为方法参数传递。
- 表达式体成员是类/结构体成员的一种简化定义方式,属于成员声明的语法糖,最终编译后会生成和传统语句体成员完全一致的IL代码。
| 对比维度 | Lambda表达式 | 表达式体成员 |
|---|---|---|
| 本质 | 匿名函数实例 | 成员声明的简化语法 |
| 使用场景 | 委托赋值、LINQ查询、事件处理等 | 类/结构体的方法、属性、构造函数等成员定义 |
| 左侧内容 | 参数列表(可省略单参数的括号) | 成员的名称和参数(如方法名、属性名) |
使用注意事项
在实际开发中用=>符号时,需要注意以下几点:
- Lambda表达式如果参数类型无法被编译器推断,需要显式声明参数类型,例如
(int x, int y) => x + y。 - 表达式体成员只能包含单个表达式,如果成员逻辑需要多条语句实现,还是要使用传统的语句体定义方式。
- 不要将=>符号和大于等于运算符>=混淆,两者的语法位置和作用完全不同,编译器会根据上下文自动区分。