C#持续进化,每个版本都引入新特性,助你编写更高效、更优雅的代码。掌握以下技巧,不仅能提升代码质量,还能让开发过程更愉悦。
1. 空值合并运算符简化空处理
结合??
与??=
简化空值检查与赋值:
string message = null;
message ??= "默认消息"; // 若message为null,赋默认值
Console.WriteLine(message); // 输出:默认消息
2. 用nameof安全重构
避免魔法字符串,用nameof
引用属性或方法:
Console.WriteLine(nameof(MyProperty)); // 输出:MyProperty
3. 简化条件逻辑的switch表达式
string GetDayType(DayOfWeek day) => day switch
{
DayOfWeek.Saturday or DayOfWeek.Sunday => "周末",
_ => "工作日"
};
4. 使用记录类型(Records)
C# 9引入的record
是不可变数据模型的理想选择:
public record Person(string Name, int Age); // 自动生成相等性与不可变性
5. 异步流优化性能
用IAsyncEnumerable<T>
异步生成数据流:
async IAsyncEnumerable<int> GetNumbersAsync()
{
for (int i = 0; i < 5; i++)
{
yield return i;
await Task.Delay(100);
}
}
6. 高性能内存访问利器Span
处理大数据时,Span<T>
显著减少内存分配:
Span<int> numbers = stackalloc int[5] { 1, 2, 3, 4, 5 };
Console.WriteLine(numbers[2]); // 输出:3
7. 全局Using指令减少样板代码
C# 10+支持全局using
指令,集中声明命名空间:
// GlobalUsings.cs
global using System;
global using System.Collections.Generic;
8. 只读结构体提升性能
设计结构体时标记readonly
,避免意外修改:
public readonly struct Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y) => (X, Y) = (x, y);
}
9. 文件作用域命名空间
C# 10引入文件级命名空间,简化代码结构:
namespace MyApp;
class Program
{
static void Main() => Console.WriteLine("Hello, world!");
}
10. 元组快速分组数据
无需定义类/结构体,直接返回多个值:
(string name, int age) GetPerson() => ("Alice", 25);
// 使用
var person = GetPerson();
Console.WriteLine($"{person.name} 年龄:{person.age}岁");
11. 表达式体成员简化代码
短方法或属性可用表达式体形式:
public int Square(int number) => number * number;
12. 字符串插值提升可读性
C# 6引入的字符串插值比拼接更清晰:
string name = "Alice";
int age = 25;
Console.WriteLine($"姓名:{name},年龄:{age}岁");
13. 模式匹配简化类型检查
C# 7的模式匹配让条件逻辑更简洁:
object data = 42;
if (data is int number)
Console.WriteLine($"整数:{number}");
14. 使用声明管理资源
C# 8的using
声明自动释放资源:
using var file = new StreamWriter("log.txt");
file.WriteLine("Hello, world!"); // 退出方法时自动释放
15. 扩展方法重构重复代码
为现有类型添加功能:
public static class StringExtensions
{
public static (string, string) SplitString(this string str, char separator)
{
int index = str.IndexOf(separator);
return (str[0..index], str[(index + 1)..]);
}
}
// 使用
var data = "test1|test2".SplitString('|');
Console.WriteLine($"{data.Item1}, {data.Item2}"); // 输出:test1, test2
16. 用yield实现惰性迭代器
IEnumerable<int> GetNumbers(int start, int count)
{
for (int i = 0; i < count; i++)
yield return start + i;
}
// 使用
foreach (var num in GetNumbers(10, 5))
Console.WriteLine(num); // 输出:10,11,12,13,14
17. 内联out变量声明
在方法调用中直接声明out
变量:
if (int.TryParse("123", out int number))
Console.WriteLine($"解析结果:{number}");
18. LINQ优雅处理数据
用LINQ简化集合操作:
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();
Console.WriteLine(string.Join(", ", evenNumbers));
高阶技巧:GroupBy
、OrderBy
、Aggregate
解决复杂数据问题。
19. async/await异步编程
提升响应性与性能:
async Task FetchDataAsync()
{
var result = await httpClient.GetStringAsync("https://example.com");
Console.WriteLine(result);
}
20. 可空引用类型规避空指针
C# 8引入可空引用类型,编译时捕获潜在空值问题:
string? name = GetName(); // 允许null
Console.WriteLine(name?.ToUpper()); // 安全访问
21. Roslyn分析器提升代码质量
集成StyleCop或SonarLint进行静态分析:
dotnet add package StyleCop.Analyzers
22. 源生成器减少样板代码
编译时自动生成代码(如实现INotifyPropertyChanged
):
// 示例项目:https://github.com/neuecc/NotifyPropertyChangedGenerator
23. 接口默认方法
C# 8允许接口方法提供默认实现:
public interface ILogger
{
void Log(string message) => Console.WriteLine($"日志:{message}");
}
24. 不可变集合线程安全
ImmutableList<T>
等集合保证线程安全:
var list = ImmutableList.Create(1, 2, 3);
var newList = list.Add(4); // 返回新集合,原集合不变
25. 条件断点智能调试
在IDE中设置条件断点:
// 当x > 10且y == 5时触发
if (x > 10 && y == 5)
Debugger.Break();
C#提供了丰富的工具集,助你编写简洁、高效、易维护的代码。掌握这25个技巧,你将成为更优秀的开发者。
该文章在 2025/3/13 11:35:24 编辑过