编辑
2025-09-18
C#
00

从C# 7.0开始,元组(Tuples)成为了C#语言的一部分,提供了一种简便的方式来处理和返回方法中的多个值。元组是一种轻量级的数据结构,允许你将多个值组合成一个单一的复合值。这在处理多返回值或需要将多个数据作为一个整体传递的场景中非常有用。本文将通过多个示例介绍如何在C#中使用元组,以及在实际开发中的应用场景。

应用场景

1. 返回方法中的多个值

在C# 7.0之前,如果你想从一个方法返回多个值,你可能需要定义一个类或结构体,或者使用out参数。使用元组,你可以更简洁地实现这一功能。

编辑
2025-09-18
C#
00

NUnit 是一个流行的 .NET 单元测试框架,它使得开发者可以轻松地编写和执行测试。本文将介绍如何使用 NUnit 进行基本的单元测试,包括测试类的设置、测试方法的编写,以及如何运行测试。

环境设置

首先,确保你的开发环境中已安装 NUnit。你可以通过 NuGet 包管理器来安装 NUnit 和 NUnit3TestAdapter。

  1. 打开 Visual Studio。
  2. 创建一个新的 C# 类库项目。

编写测试类

在你的项目中创建一个新的测试类。这个类应该包含你想要测试的方法。以下是一个简单的例子,展示如何测试一个简单的数学运算类。

编辑
2025-09-18
C#
00

在C#中,动态编译和执行代码是一个强大的功能,允许程序在运行时编译和执行新的代码片段。这在需要动态生成代码或者在运行时根据用户输入执行不同逻辑的场景下非常有用。本文将详细介绍如何在C#中实现动态编译和执行代码,并提供实用的示例。

使用场景

  1. 脚本执行: 允许用户输入自定义脚本,动态执行,常见于配置脚本或扩展功能。
  2. 插件系统: 动态编译用户提供的代码作为程序的插件,实现程序功能的扩展。
  3. 在线编程环境: 实现一个简单的在线编程环境,用户可以输入代码,服务器动态编译并返回执行结果。
  4. 自动化测试: 动态编译和执行测试脚本,实现自动化测试。

实现方法

准备工作

从 .NET Core 开始,包括 .NET 5 和 .NET 6 在内,System.CodeDom.Compiler 中的 CodeDomProvider 和相关类不再支持编译代码的功能。这是因为.NET Core以及其后续版本(包括.NET 5和.NET 6)更加注重跨平台能力和安全性,而动态编译往往涉及到更多的安全风险和平台依赖。

因此,如果你需要在 .NET 6 环境下动态编译和执行代码,推荐使用 Microsoft.CodeAnalysis(也称为 Roslyn)这个更现代的编译器平台。Roslyn 提供了完整的编译器功能,支持动态编译和代码分析。

安装 Roslyn 包

首先,你需要在你的项目中安装 Microsoft.CodeAnalysis.CSharp NuGet 包。你可以通过 NuGet 包管理器或者使用以下命令安装:

C#
dotnet add package Microsoft.CodeAnalysis.CSharp
编辑
2025-09-18
C#
00

作为一名C#开发者,你是否曾经为了调用一个简单的REST API而写了一大堆HttpClient代码?是否厌倦了手动拼接URL、处理JSON序列化、管理HTTP状态码?

据统计,普通的REST API调用代码往往需要20-30行,而且容易出错。今天我要为你介绍一个神器——RestEase,它可以将你的API调用代码减少到3-5行,同时还提供完整的类型安全保障!

本文将手把手教你如何使用RestEase,让你的API调用代码变得优雅、安全、高效。

🎯 传统HTTP客户端的痛点分析

在深入RestEase之前,我们先来看看传统方式的问题:

😫 传统方式的代码冗余

C#
using Newtonsoft.Json; namespace AppRestEase { internal class Program { static async Task Main(string[] args) { using var client = new HttpClient(); client.BaseAddress = new Uri("https://localhost:7206/api/User/"); var username = "rick"; var response = await client.GetAsync($"{username}"); response.EnsureSuccessStatusCode(); var jsonContent = await response.Content.ReadAsStringAsync(); var user = JsonConvert.DeserializeObject<User>(jsonContent); Console.WriteLine($"{user.Name} created at {user.CreatedAt}"); } } }
编辑
2025-09-18
C#
00

你是否还在为每次新增服务都要手动在Program.cs中添加注册代码而烦恼?随着项目规模的扩大,服务注册的代码越来越冗长,维护成本也越来越高。据统计,一个中等规模的.NET项目平均需要注册50+个服务,传统方式下仅服务注册代码就占据了启动文件的80%篇幅!

今天我们来探讨一个更优雅的解决方案:基于特性(Attribute)的自动服务注册,让你彻底告别手动注册的烦恼,让代码更简洁、更易维护。

🔍 问题分析:传统服务注册的痛点

传统方式的问题

在传统的.NET依赖注入中,我们需要在Program.csStartup.cs中逐一注册每个服务:

C#
// 传统注册方式 - 冗长且容易遗漏 services.AddScoped<IUserService, UserService>(); services.AddSingleton<ICacheService, CacheService>(); services.AddTransient<IEmailService, EmailService>(); services.AddScoped<IDataRepository, DataRepository>(); // ... 50+个服务的注册代码

痛点总结:

  • 📝 维护成本高:每新增一个服务都要修改启动代码
  • 🐛 容易遗漏:忘记注册服务导致运行时错误
  • 🔄 生命周期混乱:难以统一管理服务的生命周期
  • 📦 代码分散:服务定义和注册逻辑相距甚远