位置: 文档库 > C#(.NET) > C#程序员经常用到的10个实用代码片段

C#程序员经常用到的10个实用代码片段

微笑向暖 上传于 2024-05-21 11:41

《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、多线程任务及扩展方法等核心场景,每个片段均提供完整示例和详细说明,帮助开发者提升编码效率与代码质量。