掌握25个C#实战技巧:从代码优化到高效开发

作者:微信公众号:【架构师老卢】
3-1 18:15
22

C#持续进化,每个版本都引入新特性,助你编写更高效、更优雅的代码。掌握以下技巧,不仅能提升代码质量,还能让开发过程更愉悦。


图片来源:Upslash Surface


1. 空值合并运算符简化空处理

结合????=简化空值检查与赋值:

string message = null;
message ??= "默认消息";  // 若message为null,赋默认值
Console.WriteLine(message);  // 输出:默认消息

2. 用nameof安全重构

避免魔法字符串,用nameof引用属性或方法:

Console.WriteLine(nameof(MyProperty));  // 输出:MyProperty  

3. 简化条件逻辑的switch表达式

string GetDayType(DayOfWeek day) => day switch
{
    DayOfWeek.Saturday or DayOfWeek.Sunday => "周末",
    _ => "工作日"
};

4. 使用记录类型(Records)

C# 9引入的record不可变数据模型的理想选择:

public record Person(string Name, int Age);  // 自动生成相等性与不可变性

5. 异步流优化性能

IAsyncEnumerable<T>异步生成数据流:

async IAsyncEnumerable<int> GetNumbersAsync()
{
    for (int i = 0; i < 5; i++)
    {
        yield return i;
        await Task.Delay(100);
    }
}

6. 高性能内存访问利器Span

处理大数据时,Span<T>显著减少内存分配:

Span<int> numbers = stackalloc int[5] { 1, 2, 3, 4, 5 };
Console.WriteLine(numbers[2]);  // 输出:3  

7. 全局Using指令减少样板代码

C# 10+支持全局using指令,集中声明命名空间:

// GlobalUsings.cs
global using System;
global using System.Collections.Generic;

8. 只读结构体提升性能

设计结构体时标记readonly,避免意外修改:

public readonly struct Point
{
    public int X { get; }
    public int Y { get; }
    public Point(int x, int y) => (X, Y) = (x, y);
}

9. 文件作用域命名空间

C# 10引入文件级命名空间,简化代码结构:

namespace MyApp;
class Program
{
    static void Main() => Console.WriteLine("Hello, world!");
}

10. 元组快速分组数据

无需定义类/结构体,直接返回多个值:

(string name, int age) GetPerson() => ("Alice", 25);

// 使用
var person = GetPerson();
Console.WriteLine($"{person.name} 年龄:{person.age}岁");

11. 表达式体成员简化代码

短方法或属性可用表达式体形式:

public int Square(int number) => number * number;

12. 字符串插值提升可读性

C# 6引入的字符串插值比拼接更清晰:

string name = "Alice";
int age = 25;
Console.WriteLine($"姓名:{name},年龄:{age}岁");

13. 模式匹配简化类型检查

C# 7的模式匹配让条件逻辑更简洁:

object data = 42;
if (data is int number)
    Console.WriteLine($"整数:{number}");

14. 使用声明管理资源

C# 8的using声明自动释放资源:

using var file = new StreamWriter("log.txt");
file.WriteLine("Hello, world!");  // 退出方法时自动释放

15. 扩展方法重构重复代码

为现有类型添加功能:

public static class StringExtensions
{
    public static (string, string) SplitString(this string str, char separator)
    {
        int index = str.IndexOf(separator);
        return (str[0..index], str[(index + 1)..]);
    }
}

// 使用
var data = "test1|test2".SplitString('|');
Console.WriteLine($"{data.Item1}, {data.Item2}");  // 输出:test1, test2

16. 用yield实现惰性迭代器

IEnumerable<int> GetNumbers(int start, int count)
{
    for (int i = 0; i < count; i++)
        yield return start + i;
}

// 使用
foreach (var num in GetNumbers(10, 5))
    Console.WriteLine(num);  // 输出:10,11,12,13,14

17. 内联out变量声明

在方法调用中直接声明out变量:

if (int.TryParse("123", out int number))
    Console.WriteLine($"解析结果:{number}");

18. LINQ优雅处理数据

用LINQ简化集合操作:

var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();
Console.WriteLine(string.Join(", ", evenNumbers));

高阶技巧GroupByOrderByAggregate解决复杂数据问题。


19. async/await异步编程

提升响应性与性能:

async Task FetchDataAsync()
{
    var result = await httpClient.GetStringAsync("https://example.com");
    Console.WriteLine(result);
}

20. 可空引用类型规避空指针

C# 8引入可空引用类型,编译时捕获潜在空值问题:

string? name = GetName();  // 允许null
Console.WriteLine(name?.ToUpper());  // 安全访问

21. Roslyn分析器提升代码质量

集成StyleCop或SonarLint进行静态分析:

dotnet add package StyleCop.Analyzers

22. 源生成器减少样板代码

编译时自动生成代码(如实现INotifyPropertyChanged):

// 示例项目:https://github.com/neuecc/NotifyPropertyChangedGenerator

23. 接口默认方法

C# 8允许接口方法提供默认实现:

public interface ILogger
{
    void Log(string message) => Console.WriteLine($"日志:{message}");
}

24. 不可变集合线程安全

ImmutableList<T>等集合保证线程安全:

var list = ImmutableList.Create(1, 2, 3);
var newList = list.Add(4);  // 返回新集合,原集合不变

25. 条件断点智能调试

在IDE中设置条件断点:

// 当x > 10且y == 5时触发
if (x > 10 && y == 5)
    Debugger.Break();

C#提供了丰富的工具集,助你编写简洁、高效、易维护的代码。掌握这25个技巧,你将成为更优秀的开发者。

相关留言评论
昵称:
邮箱:
阅读排行