《C#程序员经常用到的10个实用代码片段》
C#作为微软主推的现代化编程语言,凭借其简洁的语法、强大的.NET框架支持和跨平台能力,已成为企业级应用开发、游戏开发(Unity引擎)和云服务领域的首选语言之一。无论是处理日常开发任务还是解决复杂业务逻辑,掌握高效的代码片段能显著提升开发效率。本文将精选10个C#程序员高频使用的实用代码片段,涵盖字符串处理、集合操作、异步编程、LINQ查询等核心场景,每个片段均附详细说明和适用场景分析。
1. 字符串与正则表达式:高效文本处理
字符串操作是开发中最基础的需求之一,从简单的格式化到复杂的模式匹配,C#提供了丰富的API。以下片段展示了如何使用正则表达式验证邮箱格式:
using System.Text.RegularExpressions;
public bool IsValidEmail(string email)
{
string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";
return Regex.IsMatch(email, pattern);
}
// 调用示例
bool isValid = IsValidEmail("test@example.com"); // 返回true
此方法通过预编译的正则表达式模式,快速判断字符串是否符合标准邮箱格式,避免手动拼接复杂逻辑。扩展应用包括密码强度检测、URL解析等场景。
2. 集合操作:LINQ的强大威力
LINQ(Language Integrated Query)是C#中最具生产力的特性之一,它允许以声明式语法处理集合数据。以下示例演示如何筛选、排序并转换集合:
using System;
using System.Linq;
using System.Collections.Generic;
var numbers = new List { 5, 2, 8, 1, 9 };
// 筛选偶数并排序
var evenNumbers = numbers.Where(n => n % 2 == 0)
.OrderBy(n => n)
.ToList();
// 输出结果:2, 8
foreach (var num in evenNumbers)
{
Console.WriteLine(num);
}
LINQ的优势在于代码可读性高,且能无缝衔接数据库查询(如Entity Framework)。进一步可结合`Select`进行投影转换,或使用`GroupBy`实现分组统计。
3. 异步编程:避免UI冻结
在WinForms/WPF或ASP.NET Core中,耗时操作(如网络请求、文件IO)必须异步执行以防止界面卡顿。以下展示如何使用`async/await`模式:
using System.Net.Http;
using System.Threading.Tasks;
public async Task FetchDataAsync(string url)
{
using (HttpClient client = new HttpClient())
{
return await client.GetStringAsync(url);
}
}
// 调用示例(需在async方法中)
string data = await FetchDataAsync("https://api.example.com/data");
关键点:标记方法为`async`,使用`await`等待异步操作完成。注意异常处理需通过`try-catch`包裹`await`调用。
4. 依赖注入:解耦与测试友好
.NET Core内置的依赖注入容器极大简化了对象生命周期管理。以下配置服务并注入的示例:
// Startup.cs 或 Program.cs(.NET 6+)
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddTransient();
builder.Services.AddScoped();
var app = builder.Build();
// ...
服务生命周期说明:
- `Transient`:每次请求创建新实例
- `Scoped`:每个HTTP请求范围内共享实例
- `Singleton`:全局单例
结合构造函数注入,代码可测试性显著提升。
5. 配置管理:读取JSON配置文件
现代.NET应用通常使用`appsettings.json`存储配置。以下演示如何绑定强类型配置对象:
// appsettings.json
{
"ConnectionStrings": {
"Default": "Server=..."
},
"Logging": {
"Level": "Information"
}
}
// 配置类
public class AppSettings
{
public ConnectionStrings ConnectionStrings { get; set; }
public Logging Logging { get; set; }
}
public class ConnectionStrings
{
public string Default { get; set; }
}
// 加载配置
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
var settings = new AppSettings();
configuration.Bind(settings);
Console.WriteLine(settings.ConnectionStrings.Default);
对于ASP.NET Core项目,可直接通过`IConfiguration`接口注入配置。
6. 日志记录:结构化日志实践
生产环境必须记录详细的日志以便排查问题。Serilog是流行的结构化日志库,以下配置示例:
using Serilog;
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Console()
.WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
try
{
Log.Information("Application started");
// 业务逻辑...
}
catch (Exception ex)
{
Log.Error(ex, "Critical error occurred");
}
finally
{
Log.CloseAndFlush();
}
优势:支持JSON格式输出、多目标写入(文件、数据库、ELK等)、按时间或大小滚动日志文件。
7. 单元测试:Mock依赖对象
使用Moq库模拟依赖项,隔离测试目标代码:
using Moq;
using Xunit;
public interface IEmailService
{
void Send(string to, string subject);
}
public class NotificationService
{
private readonly IEmailService _emailService;
public NotificationService(IEmailService emailService)
{
_emailService = emailService;
}
public void NotifyUser(string email)
{
_emailService.Send(email, "Welcome!");
}
}
public class NotificationServiceTests
{
[Fact]
public void NotifyUser_ShouldSendEmail()
{
// 创建Mock对象
var mockEmailService = new Mock();
// 调用被测方法
var service = new NotificationService(mockEmailService.Object);
service.NotifyUser("test@example.com");
// 验证方法是否被调用
mockEmailService.Verify(x => x.Send("test@example.com", "Welcome!"), Times.Once);
}
}
通过验证Mock对象的交互行为,确保代码逻辑符合预期。
8. 文件IO:安全读写操作
处理文件时需考虑异常和资源释放。以下演示使用`using`语句确保文件流正确关闭:
using System.IO;
public void WriteToFile(string path, string content)
{
try
{
File.WriteAllText(path, content); // 简化版
// 或精细控制:
// using (var writer = new StreamWriter(path))
// {
// writer.Write(content);
// }
}
catch (IOException ex)
{
Console.WriteLine($"文件操作失败: {ex.Message}");
}
}
public string ReadFromFile(string path)
{
return File.Exists(path) ? File.ReadAllText(path) : string.Empty;
}
对于大文件,建议使用异步方法`FileStream.ReadAsync`/`WriteAsync`避免阻塞线程。
9. 多线程任务:Task并行库(TPL)
当需要并行执行多个CPU密集型任务时,TPL提供简单高效的API:
using System.Threading.Tasks;
public void ProcessDataInParallel()
{
var tasks = new Task[3];
for (int i = 0; i
{
Console.WriteLine($"Task {taskId} started on thread {Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(1000); // 模拟工作
Console.WriteLine($"Task {taskId} completed");
});
}
Task.WaitAll(tasks); // 等待所有任务完成
Console.WriteLine("All tasks finished");
}
注意:线程间共享数据需使用锁(`lock`)或并发集合(`ConcurrentQueue`)避免竞态条件。
10. 扩展方法:增强现有类型功能
扩展方法允许为已有类型添加新方法,无需修改源码。以下为`string`类型添加`ToPascalCase`方法:
using System.Text;
public static class StringExtensions
{
public static string ToPascalCase(this string input)
{
if (string.IsNullOrEmpty(input)) return input;
var words = input.Split(new[] { ' ', '_', '-' }, StringSplitOptions.RemoveEmptyEntries);
var result = new StringBuilder();
foreach (var word in words)
{
if (word.Length > 0)
{
result.Append(char.ToUpper(word[0]));
if (word.Length > 1)
{
result.Append(word.Substring(1).ToLower());
}
}
}
return result.ToString();
}
}
// 调用示例
string snakeCase = "hello_world";
string pascalCase = snakeCase.ToPascalCase(); // 输出"HelloWorld"
扩展方法应放在静态类中,且第一个参数使用`this`修饰符指定目标类型。
关键词:C#代码片段、LINQ查询、异步编程、依赖注入、正则表达式、单元测试、多线程、扩展方法、配置管理、日志记录
简介:本文精选C#开发中10个高频实用代码片段,涵盖字符串处理、集合操作、异步编程、依赖注入、配置读取、日志记录、单元测试、文件IO、多线程任务及扩展方法等核心场景,每个片段均提供完整示例和详细说明,帮助开发者提升编码效率与代码质量。