c# solid原则是什么

阿浩吖_9438

阿浩吖_9438

2026-01-23

717人浏览

原创

SOLID原则是五条提升代码可维护性的设计准则,包括单一职责(类只做一件事)、开闭(对扩展开放、对修改关闭)、依赖倒置(依赖抽象而非实现)、里氏替换(子类可安全替换父类)和接口隔离(接口应小而专)。

c# solid原则是什么

C# 中的 SOLID 原则是五条设计准则,不是语法规范,也不是编译器强制要求——但它直接决定你写的代码能不能轻松加功能、改 Bug、写单元测试,或者交到别人手上时不被骂。

它解决的是“类越写越大、改一处崩三处、新加个支付方式要动七个文件”这类真实痛点。下面说清楚每条怎么用、为什么这么用、以及新手最常踩的坑。

单一职责原则(SRP):一个类只干一件事,别当瑞士军刀

典型错误是把 Employee 类塞进工资计算、数据库保存、邮件发送、日志记录——改发邮件格式?得打开这个类,顺便 review 一遍数据库连接字符串有没有写错。

正确做法是拆:Employee 只存属性;SalaryCalculator 负责算钱;DatabaseRepository 管增删改;EmailService 发邮件。

  • 判断是否违反 SRP:问自己“如果需求变,有几种可能要改这个类?”答案 >1 就该拆
  • 别为了拆而拆:比如 CustomerName 和 CustomerEmail 各建一个类,就过了——它们天然属于同一语义边界
  • 日志、异常捕获、配置读取这些横切关注点,最容易偷偷混进业务类里,要特别警惕

开闭原则(OCP):新功能靠“加”,而不是“改”

当你需要支持微信支付,却不得不去改 PaymentProcessor.Process() 方法加 if (type == "WeChat") 分支,就已经违反 OCP。

核心解法是抽象+多态:IPaymentMethod 接口定义 Pay(),让 WeChatPayment、CreditCardPayment 各自实现,PaymentProcessor 只依赖接口,不关心具体类型。

微信公众号文章自动发布助手
微信公众号文章自动发布助手

智能创作与发布:提取公众号文章、生成封面、自动写入草稿箱,适用于标题写稿、参考改写、链接提取和草稿发布的完整流程。

下载
  • 抽象粒度很重要:不要一上来就抽象“所有支付”,先从“同步支付”和“异步回调”这种实际差异点开始分
  • OCP 不等于“绝不改旧代码”:重构接口、调整参数是允许的;关键是“新增能力不碰已有逻辑”
  • 避免过度设计:刚加支付宝,就提前预留 10 个扩展点,反而增加理解成本

依赖倒置原则(DIP):高层模块不依赖低层模块,都依赖抽象

常见反模式:OrderService 直接 new SqlOrderRepository(),导致单元测试只能连真实数据库,或者换 MongoDB 就得重写全部服务层。

正确姿势:定义 IOrderRepository 接口,OrderService 构造函数接收它;SqlOrderRepository 和 MongoOrderRepository 各自实现——谁创建、谁传入,交给 DI 容器或工厂。

  • DIP 是依赖注入(DI)的理论基础,但 DIP ≠ DI:没用 DI 容器,手动传接口也算遵守 DIP
  • 接口命名要体现角色,不是技术:用 IEmailSender,别用 ISmtpClient
  • 别把 DTO、Entity 当接口用:它们是数据载体,不是行为契约

里氏替换 & 接口隔离(LSP / ISP):子类别骗人,接口别贪多

LSP 的本质是“父类能跑通的逻辑,子类不能悄悄绕过”。比如 Rectangle 继承 Shape 没问题,但若 Square 继承 Rectangle 并在 SetWidth 里强制同步 Height,那调用方按矩形逻辑设宽高后,面积就错了——这就是 LSP 破坏。

ISP 针对的是“大而全”的接口:比如 IMachine 同时定义 Print()、Scan()、Fax(),结果打印机实现类得给 Scan() 抛 NotSupportedException。应该拆成 IPrinter、IScanner、IFaxMachine。

  • LSP 最容易在“为了复用强行继承”时出事,优先考虑组合(has-a)而非继承(is-a)
  • ISP 不是越小越好:一个接口只有 1 个方法,但被 20 个类同时实现,大概率说明职责划分有问题
  • 这两个原则常一起暴露:大接口 + 强继承 = 灾难组合

真正难的不是记住这五个字母,而是每次写 class 前,多问一句:“它以后会因为几种不同的原因被修改?”——这个问题的答案,比任何设计模式都管用。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end='\n', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.27

3500

5

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

2026.02.03

269

24

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.27

375

14

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.27

375

14

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.27

375

14

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1938

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

3204

5

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

6404

49

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

2023.11.24

6589

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go-Zero HTTP服务开发指南
Go-Zero HTTP服务开发指南

共0课时 | 0人学习

Go-Zero goctl安装与使用手册
Go-Zero goctl安装与使用手册

共0课时 | 0人学习

Go-Zero框架快速开始指南
Go-Zero框架快速开始指南

共0课时 | 0人学习