Expression Bodied Members 仅适用于方法、属性、索引器、构造函数、析构函数和运算符重载等成员,且其实现体必须是单条表达式(如 x * y),不能含语句块;编译器将其转为等效传统语法,无运行时开销。

Expression Bodied Members 什么时候能用
只有方法、属性、索引器、构造函数、析构函数、运算符重载这些成员的实现体是单条表达式(不是语句块)时,才能用 =>。比如 return x + y; 可以,但 { Console.WriteLine("hi"); return x; } 不行——里面含语句,必须用传统大括号写法。
编译器会把 => 形式自动转成等效的传统语法,不带来运行时开销,纯属语法糖。
方法和只读属性怎么写最安全
方法用 => 最常见于无副作用、计算型逻辑;只读属性(get)也适合,但要注意:返回值不能是 void,也不能带 async(除非返回 Task 或 Task,且需配合 async 关键字)。
public int Square(int x) => x * x;public string Name => _name ?? "unknown";-
public Task(注意:这行本身不加GetDataAsync() => _httpClient.GetStringAsync(url); async,因为右边已是Task) - 错误写法:
public void Log() => Console.WriteLine("x");——void不支持表达式体,必须用{}
构造函数和索引器的限制很实际
构造函数可用 =>,但只能用于委托给另一个构造函数(this(...) 或 base(...)),不能包含任意逻辑。索引器同理,get 和 set 各自独立支持,但 set 的右侧必须是表达式,不能写 value = ... 这种赋值语句。
-
public Person(string name) : this(name, 0) => {};(合法,空体仅作语法占位) -
public string this[int i] => _items[i];(只读索引器) -
public string this[int i] { get => _items[i]; set => _items[i] = value; }(注意:右边是_items[i] = value表达式,不是语句) - 错误写法:
set => { _items[i] = value; };—— 大括号块不被允许
别在 async 方法里漏掉 async/await
很多人以为 async Task 能成立,其实不行:表达式体里不能直接用 await,因为 await 是语句级操作。正确写法是保留 async 关键字,并用大括号包裹 await 语句,或者让右侧直接返回一个已有的 Task。
- ✅ 正确:
public async TaskGetCountAsync() { return await _db.CountAsync(); } - ✅ 正确:
public Task(不 await,直接转发 Task)GetCountAsync() => _db.CountAsync(); - ❌ 错误:
public async Task(编译失败)GetCountAsync() => await _db.CountAsync();
这个点最容易在迁移旧代码时忽略,尤其当团队习惯统一加 async 前缀时,容易误以为表达式体也能套用相同模式。








