- 拥抱主构造函数
我曾重构过一个拥有多个构造函数的类,每个构造函数都初始化相同的属性。代码混乱不堪。直到我发现C#的主构造函数------它允许直接在类声明中定义参数,彻底消除了样板代码。
public class Person(string name, int age)
{
public string Name { get; } = name;
public int Age { get; } = age;
}
这一小改动让代码更简洁易读。
- 使用集合表达式
某天我在项目中需要初始化多个集合时,老旧的语法显得笨重不堪。C# 14引入的集合表达式彻底改变了这一切:
List<int> numbers = [1, 2, 3, 4, 5];
仿佛施了魔法------敲击键盘更少,代码清晰度倍增。
- 利用nameof优雅重构
曾因拼写错误在属性名上耗费数小时调试?nameof运算符让我不再踩坑。它在编译时检查属性名,确保万无一失。
public void LogPropertyName()
{
Console.WriteLine(nameof(Person.Name)); // 输出 "Name"
}
现在我已将其奉为圭臬。
- 空合并运算符简化空值处理
空引用异常曾是我的心头大患,直到遇到空合并运算符(??):
string name = person.Name ?? "Unknown";
虽是小改动,却让代码更健壮。
- 模式匹配革命性升级
重构庞大switch语句时,模式匹配让我体验到从功能机到智能手机的飞跃:
if (person is { Age: > 18, Name: not null })
{
Console.WriteLine($"{person.Name} is an adult.");
}
既简洁又强大。
- 字符串插值提升可读性
曾用字符串拼接写出"一团乱麻"?字符串插值让它焕然一新:
string message = $"Hello, {person.Name}! You are {person.Age} years old.";
干净到像刚擦亮的镜子。
- 元组轻松返回多个值
过去总要为返回多个值写冗长类,元组解放了我:
public (string, int) GetPersonInfo()
{
return ("Alice", 30);
}
var (name, age) = GetPersonInfo();
轻量级且高效。
- 局部函数封装私有逻辑
面对复杂方法时,局部函数就是救星:
public void ProcessData()
{
int CalculateSum(int a, int b) => a + b;
Console.WriteLine(CalculateSum(5, 10));
}
逻辑既封装又保持可读性。
- using 声明让资源管理更优雅
曾深陷嵌套using的泥潭?C# 14的using声明简化资源释放:
using var file = new StreamReader("file.txt");
更简洁,更安全。
- 异步流IAsyncEnumerable处理大数据
处理异步数据时,IAsyncEnumerable让我不再阻塞主线程:
public async IAsyncEnumerable<int> FetchDataAsync()
{
for (int i = 0; i < 10; i++)
{
await Task.Delay(100);
yield return i;
}
}
性能与优雅兼得。
(篇幅限制,以下为精简版核心内容展示)
- 默认接口方法保兼容
public interface ILogger
{
void Log(string message) => Console.WriteLine(message);
}
- 记录类型打造不可变数据
public record Person(string Name, int Age);
- Span 高性能内存操作
Span<int> numbers = stackalloc int[10];
- 索引与范围切片数组
int[] numbers = [1, 2, 3, 4, 5];
int lastNumber = numbers; // 5
int[] firstThree = numbers[..3]; // [1, 2, 3]
- 可空引用类型预防空指针
string? name = null;
- switch 表达式简化条件判断
string result = person.Age switch
{
> 18 => "Adult",
_ => "Minor"
};
- with 表达式快速复制记录
var updatedPerson = person with { Age = 31 };
- 属性验证的nameof妙用
Required(nameof(Person.Name))
- CallerArgumentExpression 精准调试
public void Validate(bool condition, [CallerArgumentExpression("condition")] string? message = null)
{
if (!condition) throw new ArgumentException(message);
}
- 全局using指令解放重复代码
global using System;
- 文件作用域命名空间优化结构
namespace MyApp;
public class Person { }
- required 属性确保初始化
public class Person
{
public required string Name { get; set; }
}
- init 访问器实现只读初始化
public class Person
{
public string Name { get; init; }
}
- 记录结构体融合值语义
public record struct Point(int X, int Y);
- 接口静态抽象成员赋能泛型
public interface IAddable<T> where T : IAddable<T>
{
static abstract T operator +(T a, T b);
}
- params 与Span的高效参数处理
public void ProcessNumbers(params Span<int> numbers) { }
- UnscopedRef 保障ref安全
public ref int GetReference(int[] numbers)
{
return ref numbers[0];
}
- 自定义字符串插值处理器
InterpolatedStringHandler
public ref struct LogInterpolatedStringHandler { }
- unmanaged 约束强化类型安全
public void Process<T>(T value) where T : unmanaged { }
- SkipLocalsInit 提升性能
SkipLocalsInit
public void Process() { }
- ModuleInitializer 实现模块级初始化
ModuleInitializer
internal static void Initialize() { }
- CallerFilePath/LineNumber 精准定位问题
public void Log(string message, [CallerFilePath] string? file = null, [CallerLineNumber] int line = 0)
{
Console.WriteLine($"{file}:{line} - {message}");
}
- unsafe 代码进行底层操作
unsafe void Process(int* pointer) { }
- 固定缓冲区优化栈内存分配
unsafe struct Buffer
{
public fixed int numbers[10];
}
- volatile 确保线程安全访问
private volatile bool _isRunning;
- MemoryMarshal 处理原始内存
Span<int> numbers = MemoryMarshal.Cast<byte, int>(buffer);
- ArrayPool 优化数组内存复用
var pool = ArrayPool<int>.Shared;
int[] array = pool.Rent(10);
pool.Return(array);
- ValueTask 轻量级异步处理
public async ValueTask<int> ProcessAsync() { }
- CancellationToken 实现任务取消
public async Task ProcessAsync(CancellationToken token) { }
- ConfigureAwait 优化异步性能
await Task.Delay(100).ConfigureAwait(false);
- Task.WhenAll 并行执行任务
await Task.WhenAll(task1, task2, task3);
- Task.WhenAny 获取首个完成任务
var completedTask = await Task.WhenAny(task1, task2, task3);
- Task.Run 启动后台任务
await Task.Run(() => Process());
- TaskCompletionSource 自定义任务
var tcs = new TaskCompletionSource<int>();
tcs.SetResult(42);
- Parallel.ForEach 并行处理集合
Parallel.ForEach(collection, item => Process(item));
- 并发集合保障线程安全
var queue = new ConcurrentQueue<int"];
queue.Enqueue(42);
- 不可变集合确保数据安全
var list = ImmutableList.Create(1, 2, 3);
- LINQ 声明式数据处理
var adults = people.Where(p => p.Age > 18).ToList();
- 表达式树构建动态查询
Expression<Func<Person, bool>> expr = p => p.Age > 18;
- 源生成器自动化代码生成
Generator
public class MyGenerator : ISourceGenerator { }