在我看到的所有示例中,即使在MSDN文档示例中,C#自动实现的属性也是公开的.来自C++背景,我一直被告知,将成员数据设为私有是个好主意,除非有充分的理由不这样做.
为什么以下从未使用过(至少我从未见过它):
private Name { get; set; }
Run Code Online (Sandbox Code Playgroud)
我查看了MSDN文档并阅读了几个关于自动实现属性的教程,但似乎没有任何关于它们的优缺点的建议以及何时应该避免它们.自动实现的属性会破坏程序安全吗?有没有应该避免的情况?在哪些情况下他们是理想的选择?
谢谢.
你是正确的,只是公开支持字段的自动实现的属性对公共字段没有多大好处.
正如Alan Kay所说:
但是大多数使用setter的人只是使用它们来模拟内部变量的直接赋值,这违反了真实OOP的精神和意图.
但是,公共字段上的自动实现属性有一个优点,那就是以后修改实现是一个不间断的更改.如果你有一个公共领域,你的类之外的代码操纵,公共领域,你不能在课堂上,否则触及这一领域将不得不重新编译任何其他代码的未来版本更改为私有字段.相比之下,一旦拥有了公共属性,就可以在将来的版本中修改该属性的实现,并且客户端类可以继续使用它而不做任何更改.
因此,对于现在具有普通的getter和setter 实现的属性使用自动实现的属性是有用的,但是将来可能会有更复杂的实现.
您是否问过自己,为什么您总是被告知将会员设为私有是个好主意?
这是因为(除其他原因外)字段是一个实现细节。“在内存中存储数据”的细节对于任何希望检索或设置数据的对象来说都是不重要的细节。另一个类不需要关心他是否可以访问某个地方的某个内存槽 - 他只需要一个可以传递或检索值的接口 - 有 getter 和 setter,或者属性。
将属性与“基于内存的存储”的细节分离后,我们获得了很多优势。主要是 - 我们可以重写获取和设置的行为,而不会扰乱任何使用该属性的代码。我们还可以使用该属性作为抽象来通过许多不同的实现检索数据。这对于测试/模拟行为以及提供替代存储非常有用。如果其他类依赖于“内存存储”的实现细节,那么您将无法在不破坏所有这些的情况下更改类的行为。
在自动属性出现之前,出于上述原因,我们通常会存储一个字段并创建一个 getter 和 setter 来封装它。汽车资产为我们实现了自动化。我们可能会编写在代码中随处使用字段的代码,但我们这样做的想法是“我现在将其作为字段,但如果标准发生变化,以后可能会发生变化”。
由于类知道它自己的实现,因此创建私有自动属性通常是毫无意义的,您不会隐藏已知的细节。如果您需要公开给子类,受保护的自动属性可能会很有用。
至于应该避免的情况:当您需要只读数据时。(对象构造后不会改变的数据)。自动属性缺乏允许您创建由只读数据支持的自动化属性的语法。
归档时间: |
|
查看次数: |
3631 次 |
最近记录: |