C# 语法糖是 C# 编程语言中为了简化代码和提高代码可读性而引入的一系列语言特性。这些特性在编译时会被转换成更基本的代码形式,但在编写代码时提供了更加简洁和直观的方式。以下是对 C# 中常见语法糖的一个总结:

1.表达式体属性:使用 => 运算符定义属性的 getter 或 setter。

public string FullName => FirstName + " " + LastName;

2.隐式类型局部变量(var 关键字):编译器根据初始化表达式推断变量的类型。

var number = 42; // 推断为 int 类型

3.Lambda 表达式:定义匿名函数的简洁方式。

Func<int, int, int> add = (x, y) => x + y;

4.表达式体成员:用于方法和委托。

public int Square(int x) => x * x;

5.字符串插值:在字符串中嵌入变量或表达式的值。

string message = $"Hello, {name}!";

6.空合并运算符(??):当左侧操作数为 null 时,返回右侧操作数的值。

string result = value ?? "Default Value";

7.异步/等待(async/await):简化异步编程模型。

public async Task<string> GetWebPageAsync(string url)
  {
      using (var client = new HttpClient())
      {
          return await client.GetStringAsync(url);
      }
  }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

8.使用语句(using 声明):自动释放资源,如文件和网络连接。

using (var file = new StreamReader("file.txt"))
  {
      // 读取文件内容
  } // file 对象在这里会被自动释放
  • 1.
  • 2.
  • 3.
  • 4.

9.命名参数:在调用方法时,通过参数名指定参数值,提高代码可读性。

MyMethod(name: "Alice", age: 30);

10.默认参数值:在方法声明中为参数指定默认值。

public void MyMethod(string name = "Default") { /* ... */ }

11.扩展方法:允许你为已存在的类型添加新的方法,而无需创建新的派生类。这使得你可以在不修改原始代码的情况下扩展类的功能。

public static class StringExtensions
  {
      public static string ToUpperInvariant(this string s)
      {
          return s.ToUpper(CultureInfo.InvariantCulture);
      }
  }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

12.名称空间别名:允许你为名称空间或类型定义别名,以简化代码中的引用。

using System.Collections.Generic;
using List = System.Collections.Generic.List<int>; // 定义别名
List numbers = new List(); // 使用别名
  • 1.
  • 2.
  • 3.

13.空条件运算符(?.):当左侧的操作数不为 null 时,才访问其成员或调用其方法。这可以避免 NullReferenceException。

string text = null;

int? length = text?.Length; // 如果 text  null,则 length  null;否则为 text 的长度

14.元组:从 C# 7.0 开始,可以使用 ValueTuple 来创建轻量级的、不可变的数据结构,用于表示具有多个值的单个对象。

var person = (Name: "Alice", Age: 30);

Console.WriteLine(person.Name); // 输出 "Alice"

15.模式匹配:C# 7.0 及更高版本引入了模式匹配功能,包括 is 类型模式和 switch 表达式,使得在条件语句中检查类型和执行相应操作变得更加简洁。

object obj = "hello";
  if (obj is string s)
  {
      Console.WriteLine(s.ToUpper()); // 输出 "HELLO"
  }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

16.弃元(Discard):使用下划线 _ 作为占位符来表示不关心的变量值,这在解构赋值或模式匹配中特别有用。

var (first, _) = GetTuple(); // 只关心第一个值,忽略第二个值

17.范围(Range)操作符:C# 8.0 引入了范围操作符 ..,它允许你指定一个序列的子范围。

int[] numbers = { 0, 1, 2, 3, 4, 5 };
int[] subArray = numbers[1..4]; // { 1, 2, 3 }
  • 1.
  • 2.

18.顶级语句:C# 9.0 及更高版本允许在编译单元的顶层直接编写语句,而无需包含在方法或类中。这简化了脚本和小型程序的编写。

using System;
Console.WriteLine("Hello, World!"); // 直接在顶层编写的语句
  • 1.
  • 2.

19.记录(Record)类型:C# 9.0 引入了记录类型,它提供了更简洁的语法来定义不可变数据类型的值语义,并自动实现相等性、哈希码和字符串表示形式。

public record Person(string Name, int Age);

20.可空类型:使用可空类型(如 int?)可以表示值类型的空值,避免了使用默认值来表示空值的问题。

int? age = null;
if (age.HasValue)
{
      // 处理非空值的情况
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

21.nameof 表达式:返回变量、类型或成员的名称作为字符串,主要用于异常消息、日志记录等。

string name = "Alice";

Console.WriteLine(nameof(name)); // 输出 "name"

22.抛出表达式(Throw expressions):允许在表达式中使用 throw 语句,而不仅仅是在语句中。

return someCondition ? someValue : throw new InvalidOperationException();

23.使用声明(Using declarations):从 C# 8.0 开始,可以在代码块内部直接声明 using 变量,而无需在外部声明和初始化。

using var file = new StreamReader("file.txt");
// 使用 file 进行操作...
// 在代码块结束时,file 会被自动释放
  • 1.
  • 2.
  • 3.

24.LINQ(Language Integrated Query):允许你在 C# 中直接编写查询语句,而无需使用额外的查询语言。

var query = from p in people
            where p.Age > 18
            select p.Name;
  • 1.
  • 2.
  • 3.

25.条件编译指令:使用如 #if, #else, #endif 等预处理指令,可以根据不同的编译条件包含或排除代码块。这对于跨平台开发或调试非常有用。

#if DEBUG
    Console.WriteLine("Debug mode is enabled.");
#endif
  • 1.
  • 2.
  • 3.