style: 命令不可变化与规范补充

This commit is contained in:
2025-12-02 12:09:46 +08:00
parent 3e01943727
commit 541b75ecd8
13 changed files with 217 additions and 186 deletions

View File

@@ -143,8 +143,51 @@
6. [ ] **精度丢失**Long 类型的 ID 是否转为了 String
7. [ ] **配置硬编码**:是否直接写死了连接串或密钥?
## 17. .NET 10 / C# 14 现代语法最佳实践(增量)
> 2025 年推荐的 20 条语法规范,新增特性优先,保持极简。
1. **field 关键字**:属性内直接使用 `field` 处理后备字段,`set => field = value.Trim();`。
2. **空值条件赋值 `?.=`**:仅对象非空时赋值,减少 `if`。
3. **未绑定泛型 nameof**`nameof(List<>)` 获取泛型类型名,无需占位类型参数。
4. **Lambda 参数修饰符**:在 Lambda 中可用 `ref/out/in` 与默认参数,例如 `(ref int x, int bonus = 10) => x += bonus;`。
5. **主构造函数 (Primary Constructor)**:服务/数据类优先 `class Foo(IDep dep, ILogger<Foo> logger) { }`。
6. **record/required/init**DTO 默认用 record关键属性用 `required`;不可变属性用 `init`。
7. **集合表达式与展开**:使用 `[]` 创建集合,`[..other]` 拼接,`str[1..^1]` 进行切片。
8. **模式匹配**:列表模式 `[1, 2, .. var rest]`、属性模式 `{ IsActive: true }`、switch 表达式简化分支。
9. **文件范围命名空间/全局 using**:减少缩进与重复引用;复杂泛型用别名。
10. **顶级语句**Program.cs 保持顶级语句风格。
11. **原始/UTF-8 字面量**:多行文本用 `"""`,性能场景用 `"text"u8`。
12. **不可变命令优先**:命令/DTO 优先用 record 和 `with` 非破坏性拷贝,例如 `command = command with { MerchantId = merchantId };`,避免直接 `command.Property = ...` 带来的副作用。
(其余规则继续遵循上文约束:分层、命名、异步、日志、验证、租户/ID 策略等。)
## 18. .NET 10 极致性能优化最佳实践(增量)
> 侧重零分配、并发与底层优化,遵循 2025 推荐方案。
1. **Span/ReadOnlySpan 优先**API 参数尽量用 `ReadOnlySpan<char>` 处理字符串/切片,避免 Substring/复制。
2. **栈分配与数组池**:小缓冲用 `stackalloc`,大缓冲统一用 `ArrayPool<T>.Shared`,禁止直接 `new` 大数组。
3. **UTF-8 字面量**:常量字节使用 `"text"u8`,避免运行时编码。
4. **避免装箱**:热点路径规避隐式装箱,必要时用 `ref struct` 约束栈分配。
5. **Frozen 集合**:只读查找表用 `FrozenDictionary/FrozenSet`,初始化后不再修改。
6. **SearchValues SIMD 查找**Span 内多字符搜索用 `SearchValues.Create(...)` + `ContainsAny`。
7. **预设集合容量**`List/Dictionary` 预知规模必须指定 `Capacity`。
8. **ValueTask 热点返回**:可能同步完成的异步返回 `ValueTask<T>`,减少 Task 分配。
9. **Parallel.ForEachAsync 控并发**I/O 并发用 Parallel.ForEachAsync 控制并行度,替代粗暴 Task.WhenAll。
10. **避免 Task.Run**:在 ASP.NET Core 请求中不使用 Task.Run 做后台工作,改用 IHostedService 或 Channel 模式。
11. **Channel<T> 代替锁**:多线程数据传递优先使用 Channels实现无锁生产者-消费者。
12. **NativeAOT/PGO/向量化**:微服务/工具开启 NativeAOT保留动态 PGO计算密集场景考虑 System.Runtime.Intrinsics。
13. **System.Text.Json + 源生成器**:全面替换 Newtonsoft.Json使用 `[JsonSerializable]` + 生成的 `JsonSerializerContext`,兼容 NativeAOT零反射。
14. **Pipelines 处理流**TCP/文件流解析使用 `PipeReader/PipeWriter`,获得零拷贝与缓冲管理。
15. **HybridCache**:内存+分布式缓存统一用 HybridCache利用防击穿合并并发请求。
## 19. 架构优化(增量)
> 架构优化方案
1. **Chiseled 容器优先**:生产镜像基于 `mcr.microsoft.com/dotnet/runtime-deps:10.0-jammy-chiseled`,无 Shell、非 root缩小攻击面符合零信任要求。
2. **默认集成 OpenTelemetry**:架构内置 OTel统一通过 OTLP 导出 Metrics/Traces/Logs避免依赖专有 APM 探针。
3. **内部同步调用首选 gRPC**:微服务间禁止 JSON over HTTP同步调用统一使用 gRPC配合 Protobuf 源生成器获取强类型契约与更小载荷。
4. **Outbox 模式强制**:处理领域事件时,事件记录必须与业务数据同事务写入 Outbox 表;后台 Worker 轮询 Outbox 再推送 MQRabbitMQ/Kafka禁止事务提交后直接发消息以避免不一致。
5. **共享资源必加分布式锁**:涉及库存扣减、定时任务抢占等共享资源时,必须引入分布式锁(如 Redis RedLock防止并发竞争与脏写。
---
# Working agreements
- 严格遵循上述技术栈和命名规范。
- 严格遵循上述技术栈和命名规范。