SUNKAIS OS · READ ONLY

Jarvis

登录后,可以询问自己的任务、项目和记录。

登录后使用
Sun KaisPersonal Research Institute · 私人研究机构

Mathematics · Computational Science · Engineering · Personal Knowledge Systems

更多
SUNKAIS · PERSONAL OS

搜索全站功能

选择 前往

LANG-08 · PROGRAMMING WORKBENCH

C#

用现代类型、async/await 与 .NET 工具链构建桌面、Web 和服务应用。

围绕记录、LINQ、依赖注入、dotnet CLI、NuGet、xUnit 与异步诊断构建可维护 C# 工程。

MENTAL MODEL / 心智模型

先建立正确的程序直觉

托管内存由 GC 回收,但 IDisposable 资源需要确定性释放;Task 表示异步操作,async void 只适用于事件处理器。

CODE REPOSITORY / 代码仓库锚点

从可测试的目录开始

dotnet-project/
├─ MemoryTools.sln
├─ src/MemoryTools/MemoryTools.csproj
├─ src/MemoryTools/Program.cs
├─ src/MemoryTools/TaskService.cs
└─ tests/MemoryTools.Tests/TaskServiceTests.cs

QUICK START / 第一条命令

先跑通最小闭环

dotnet new console -n MemoryTools && dotnet run --project MemoryTools

LEARNING ROUTE / 学习路径

从写出代码到守住生产边界

每个节点都包含可复制示例、判断原则与常见陷阱。

01常用方法记录、LINQ 与异步02工程结构Solution、项目与分层03构建运行dotnet CLI 与发布04依赖管理NuGet 与中央版本05调试测试xUnit、日志与诊断工具06错误诊断空值、异步与依赖注入错误07安全边界输入绑定、SQL 与资源安全
01常用方法

记录、LINQ 与异步

用不可变记录表达值,用 LINQ 表达查询,用 Task 表达异步结果。

记录与匹配代码示例
public sealed record TaskItem(string Id, string Title, TaskState State);

var label = item.State switch {
    TaskState.Done => "完成",
    TaskState.Todo => "待办",
    _ => "未知"
};

switch expression 配合穷尽分支表达有限状态。

可取消异步代码示例
public async Task<string> LoadAsync(Uri uri, CancellationToken ct)
{
    using var response = await http.GetAsync(uri, ct);
    response.EnsureSuccessStatusCode();
    return await response.Content.ReadAsStringAsync(ct);
}

库方法接收 CancellationToken 并传给下游;HttpClient 通常复用而非每次新建。

02工程结构

Solution、项目与分层

解决方案组织多个项目,业务核心避免依赖具体 UI/数据库。

创建解决方案终端命令
dotnet new sln -n MemoryTools
dotnet new classlib -n MemoryTools.Core -o src/MemoryTools.Core
dotnet new xunit -n MemoryTools.Tests -o tests/MemoryTools.Tests
dotnet sln add src/MemoryTools.Core tests/MemoryTools.Tests

测试项目再通过 dotnet add reference 引用核心项目。

严格项目设置代码示例
<PropertyGroup>
  <TargetFramework>net10.0</TargetFramework>
  <Nullable>enable</Nullable>
  <ImplicitUsings>enable</ImplicitUsings>
  <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>

示例采用当前 LTS;实际目标框架仍要按部署环境与支持周期选择。

03构建运行

dotnet CLI 与发布

restore、build、test、publish 组成统一 SDK 工作流。

完整验证终端命令
dotnet restore --locked-mode
dotnet build --no-restore
dotnet test --no-build
dotnet publish src/MemoryTools -c Release

locked-mode 需要 packages.lock.json;否则先根据团队策略启用锁文件。

开发监听终端命令
dotnet watch --project src/MemoryTools run

适合开发热重载;生产使用 publish 后产物和固定启动参数。

04依赖管理

NuGet 与中央版本

明确包源、锁定版本,并把跨项目版本集中治理。

包管理终端命令
dotnet add src/MemoryTools package Microsoft.Extensions.Http
dotnet list package --outdated
dotnet list package --vulnerable

升级后阅读变更并运行完整测试;私有源凭据不要写入仓库。

中央版本入口代码示例
<Project>
  <PropertyGroup><ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally></PropertyGroup>
  <ItemGroup><PackageVersion Include="xunit" Version="2.9.3" /></ItemGroup>
</Project>

放在 Directory.Packages.props;版本仅作结构示例,应跟随当前兼容版本。

05调试测试

xUnit、日志与诊断工具

测试可观察行为,用结构化日志与 dotnet 工具定位运行问题。

xUnit 测试代码示例
[Theory]
[InlineData("2", 2)]
[InlineData(" 5 ", 5)]
public void ParsesCount(string raw, int expected)
{
    Assert.Equal(expected, CountParser.Parse(raw));
}

边界和错误可分别使用 Theory 数据与 Assert.Throws。

运行测试终端命令
dotnet test --logger "console;verbosity=detailed" --collect:"XPlat Code Coverage"

覆盖率用于发现未执行路径,不代表测试质量。

06错误诊断

空值、异步与依赖注入错误

开启 nullable,完整 await Task,并从最内层异常追踪注册与配置。

无法解析服务诊断清单
读取异常中的 service type → 检查注册生命周期与构造函数 → 避免 singleton 捕获 scoped 服务 → 为组合根写启动测试。

不要在业务代码里用 ServiceLocator 绕过缺失注册。

异步卡死或异常丢失诊断清单
全程 await Task;避免 .Result/.Wait() 阻塞;async void 仅事件处理;为 I/O 传递取消和超时。

在库代码和应用代码中保持异步调用链完整。

07安全边界

输入绑定、SQL 与资源安全

DTO 输入先验证并授权,再映射到领域对象;确定性释放 IDisposable。

确定性释放代码示例
await using var stream = File.OpenRead(path);
var result = await ParseAsync(stream, cancellationToken);

await using 用于 IAsyncDisposable;GC 不保证及时关闭外部资源。

安全清单诊断清单
EF/LINQ 参数化并避免拼 SQL;每个资源操作都做授权;Data Protection 管理敏感令牌;限制请求/上传;生产不回显详细异常。

模型绑定成功只说明格式可解析,不说明调用者有权限或值符合业务规则。

PRIVATE CODE VAULT / 私人代码仓库

C# 私人代码与伪代码仓库

把 C# 的练习、工程片段、算法伪代码、验证说明与历史版本保存在登录后的私人空间。

TEXT ONLYRLS PRIVATENO EXECUTION
这里只归档,不运行代码。支持导入与下载纯文本源码;`.mlx`、`.xlsx`、`.accdb` 等二进制容器不会入库。密码、Token、私钥等秘密也会被拒绝,请改用环境变量。
PRIVATE SESSION REQUIRED

登录后打开你的私人仓库

游客只看到这个说明,不会收到、缓存或渲染任何私人源码。

安全登录

REFERENCE SOURCES / 官方与高质量资料

版本差异优先以官方文档为准

先在本站找回路径,再进入原始文档确认版本、平台和完整前置条件。

DELIVERY LOOP / 练习闭环

把每次练习变成可以重新运行的资产

  1. 01 · 定义写清输入、输出、边界与失败行为。
  2. 02 · 最小实现先让单一案例从命令行完整运行。
  3. 03 · 验证增加边界测试、调试信息与质量检查。
  4. 04 · 沉淀提交代码、README、依赖清单和复现命令。