5个C#特性帮你避免项目中的重复代码
多年来,我审查了数千行C#代码——从初级开发者的原型到企业级平台。
你知道我经常看到什么吗?
重复代码。
同样的验证逻辑出现在4个地方。重复的try-catch块。复制粘贴的服务调用,只有细微差别。
这并不总是有意的。有时只是缺乏意识。所以今天,我想帮你解决这个问题。
以下是C#中的5个强大特性,它们可以帮助你消除重复,提高可维护性,编写更优雅、DRY的代码。
1. 扩展方法
你是否曾经需要在多个地方检查null或修剪字符串?
不要在每个地方都写相同的工具代码,使用扩展方法。
public static class StringExtensions
{
public static bool IsNullOrEmpty(this string value)
=> string.IsNullOrEmpty(value);
}
现在你可以像调用字符串类的一部分一样调用"hello".IsNullOrEmpty()。
使用它们来:
o 为你不控制的类型添加行为
o 将助手方法限制在命名空间范围内
o 提高可读性和重用性
但要避免滥用——不要在晦涩的扩展中隐藏复杂逻辑。
2. 泛型
如果你写过两个只在类型上不同的方法,你可能需要泛型。
public T FirstOrDefaultSafe<T>(IEnumerable<T> source)
{
return source?.FirstOrDefault();
}
泛型让你抽象掉类型细节。这可以防止跨类型的重复,并促进可重用库的开发。
使用泛型来:
o 仓储模式
o 工具方法
o 通用服务响应
优秀的工程师抽象模式。伟大的工程师也抽象类型。
3. 特性和反射
想象一下有10个不同的模型类,需要验证一个名为Email的属性。
不要在每个地方重复逻辑,使用自定义特性并通过反射扫描它们。
[Required]
[EmailAddress]
public string Email { get; set; }
像ASP.NET Core这样的框架已经通过[DataAnnotation]特性做到了这一点。
但你可以为自己的需求编写:
o 自定义验证
o 审计
o 缓存行为
定义一次。到处应用。
在提高清晰度的地方使用它。但不要过度优化可读性。
4. 委托和Func<>
有时逻辑会改变,但结构不会。
不要重复整个方法,将变化的逻辑作为委托传递。
public void ProcessData(Func<string, string> transform)
{
var raw = "input";
var result = transform(raw);
Console.WriteLine(result);
}
现在你可以注入逻辑,比如:
o s => s.ToUpper()
o s => new string(s.Reverse().ToArray())
委托保持结构恒定,逻辑灵活。
5. 基类和抽象类
经典的OOP仍然有效。
当你发现自己在服务或控制器中编写相同的方法时,提取一个基类。
public abstract class ControllerBase
{
protected void Log(string message) { ... }
}
可重用性是清洁架构的基础。
只是不要继承太深——在合理的情况下优先选择组合。
最终思考
重复代码不仅仅是代码异味——它是未来的维护噩梦。
当相同的逻辑存在于5个地方时:
o 更难改变
o 容易破坏
o 测试痛苦
C#语言为你提供了强大的工具来保持代码DRY。但由你来谨慎地应用它们。
所以下次你发现自己复制粘贴时——暂停。
问:我能把这个提取到一个方法中吗?一个扩展?一个泛型助手?
清洁代码不仅仅是写更少的行。
它是关于构建与团队一起成长的系统——而不是在自身重量下崩溃。