c# - 澄清我对 C# 封装的理解

标签 c# unity-game-engine encapsulation

过去几天我一直在尝试弄清楚封装,并想知道我的理解是否正确。

当您创建一个类或结构时,在类或结构内部创建您不希望其他类或结构访问的私有(private)变量和方法,然后创建公共(public)方法来读取、写入或使用,这就是封装其他类或结构内部的私有(private)变量和方法?

如果是这样,你为什么要这样做?你怎么知道什么时候使用这个?与不使用封装相比,这有什么优势?如果可能的话,能否提供一些可以从封装中受益的“坏”代码的示例?

感谢您花时间阅读我的问题。

最佳答案

投入我的两分钱。

对于封装,基本上有两个原因。

  1. 保护。
  2. 组织。

你必须认识到,你写的代码不仅是给你自己看的,也是供其他人阅读和使用的(而且他们不能改变你的代码),尤其是当你创建一个库或框架时。当其他人使用你的类/库时,他们不会记住你的类的所有实现细节。他们希望您的代码在直观使用时能够正常工作。

组织:

将相关信息放在正确的位置。例如在 c# List<T> 中有特性Count ,很自然地不断跟踪您的列表中有多少项目,并且用户很自然地询问我的列表中有多少项目。应该是List的责任类来跟踪它并且更容易。如果您不提供此属性怎么办?用户必须自行跟踪。每次你想知道列表中有多少项时,你都必须编写重复的代码和逻辑来自己计算。当您在“列表”之外跟踪它时很容易犯错误,并且当它发生在很多地方时很难更改代码。Count信息自然属于您的List类,它应该自然地保留在那里。每次您想知道伯爵时,只需询问您的 List对象。

保护:

为了保护您的对象内部状态在使用过程中始终正确。 约中的相同示例。 “Count”属性实际上是公共(public)读和私有(private)写。 当您实现AddRemove ,您会记得增加或减少 Count ,你会记得保护你的Count与列表中的项目数同步,并且永远不会低于 0。想象一下,如果没有封装,一切都是公共(public)的。 10 年后,没有什么可以阻止用户或您自己继续这样做 Count = -100 (相信我,其他用户或你自己10年后也会这样做),那么你的List对象变得完全没有意义。而且它会产生许多难以发现的错误,甚至造成真正的巨大损害,永远不要低估程序的损害程度 bug 可以做到。

关于c# - 澄清我对 C# 封装的理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53509619/

相关文章:

c# - C# 中的 Javascript 问题

java - 在 Java 的抽象类中使用 protected 字段

c# - 更新面板中的 Ajax GridView 选择不起作用

c# - 如何在 C# 中获取泛型方法的值

c# - 统一错误: Setting the parent of a transform which resides in a Prefab Asset is disabled to prevent data corruption

c# - 旋转时相机抖动(而非移动)

unity-game-engine - 我可以在 VR 应用程序中在计算机屏幕上使用鼠标吗?

java - 为什么我们在 java 中将变量声明为私有(private)

C#:将字段定义为私有(private)但可在泛型中修改

c# - 使用未分配的局部变量(插入数据库)