c# solid原则是什么

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

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

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

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

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

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

  • 判断是否违反 SRP:问自己“如果

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

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

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

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

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

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

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

正确姿势:定义 IOrderRepository 接口,OrderService 构造函数接收它;SqlOrderRepositoryMongoOrderRepository 各自实现——谁创建、谁传入,交给 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。应该拆成 IPrinterIScannerIFaxMachine

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

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


# go  # mongodb  # 支付宝  # 微信  # 打印机  # mac  # 微信支付  # ai  # c#  # lsp  # 为什么  # red  # print  # if  # 多态  # 父类  # 子类  # 构造函数  # 字符串  # 继承  # 接口  # class  # 异步  # 数据库  # 重构  # bug  # 的是  # 则是  # 一件事  # 几种  # 而非  # 最容易  # 发邮件  # 五条  # 单元测试 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  如何在服务器上三步完成建站并提升流量?  jQuery validate插件功能与用法详解  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  php json中文编码为null的解决办法  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  如何在腾讯云免费申请建站?  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  高防服务器:AI智能防御DDoS攻击与数据安全保障  使用C语言编写圣诞表白程序  利用vue写todolist单页应用  海南网站制作公司有哪些,海口网是哪家的?  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  如何在IIS服务器上快速部署高效网站?  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  如何有效防御Web建站篡改攻击?  利用JavaScript实现拖拽改变元素大小  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  如何将凡科建站内容保存为本地文件?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  电商网站制作价格怎么算,网上拍卖流程以及规则?  如何快速搭建二级域名独立网站?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  浅谈javascript alert和confirm的美化  如何用搬瓦工VPS快速搭建个人网站?  bing浏览器学术搜索入口_bing学术文献检索地址  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  公司门户网站制作流程,华为官网怎么做?  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  打造顶配客厅影院,这份100寸电视推荐名单请查收  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  LinuxShell函数封装方法_脚本复用设计思路【教程】  jQuery 常见小例汇总  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  黑客如何利用漏洞与弱口令入侵网站服务器?  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  Android okhttputils现在进度显示实例代码  Laravel如何集成Inertia.js与Vue/React?(安装配置)  如何用西部建站助手快速创建专业网站?  晋江文学城电脑版官网 晋江文学城网页版直接进入  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何在阿里云购买域名并搭建网站?