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