C#避免重复代码的5个强大特性

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