讲师中心 微信公众号
AI工具推荐 视频效率加速

c# solid原则是什么

阿浩吖_9438

阿浩吖_9438

发布时间:2026-01-23 08:55:02

|

717人浏览过

|

来源于php中文网

原创

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 只依赖接口,不关心具体类型。

微信小程序隐私权限调试
微信小程序隐私权限调试

一站式排查小程序隐私授权报错(errno 104 / buttonId is wrong 等)+ 标准修改模式。适用:隐私协议配置、隐私弹窗不弹、授权报错、隐私接口调用失败。已抽离具体项目,适用于任何微信小程序。

下载
  • 抽象粒度很重要:不要一上来就抽象“所有支付”,先从“同步支付”和“异步回调”这种实际差异点开始分
  • 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 前,多问一句:“它以后会因为几种不同的原因被修改?”——这个问题的答案,比任何设计模式都管用。

热门AI工具

更多
小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

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

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

3320

2023.09.27

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

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

269

2026.02.03

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

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

375

2025.11.27

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

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

375

2025.11.27

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

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

375

2025.11.27

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

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

1878

2023.08.03

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

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

3044

2023.09.04

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

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

6304

2023.10.24

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn