我读了很多关于我从不应该在我的模型和DTOS中使用字段的内容,但我从未读过为什么会这样。
public int property{ get; set; }
public int Foo;
引擎盖下是两个人之间的区别?
答案 0 :(得分:4)
一个重要的区别是接口可以有属性但不能有字段。
JON SKEET给出的article对于理解这一点非常有用。
物业的实际好处
有时您可以使用非私人字段,因为 无论出于何种原因,您都不关心上述兼容性原因。 然而,即使是微不足道的使用属性仍然有好处 情况:
- 具有属性的更精细的访问控制。需要它是公开可获得的,但实际上只希望它设置为受保护 访问?没问题(从C#2开始,至少)。
- 每当值发生变化时,想要进入调试器吗?只需在setter中添加一个断点即可。
- 想要记录所有访问权限吗?只需将日志添加到getter。
- 属性用于数据绑定;字段不是。
答案 1 :(得分:3)
一个很好的理由是因为它允许您在getter和setter中包含逻辑和验证
答案 2 :(得分:2)
取自:http://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx
物业的实际好处
有时您可以使用非私人字段,因为无论出于何种原因您都不关心上述兼容性原因。但是,即使对于微不足道的情况,使用属性仍然有好处:
具有属性的更细粒度的访问控制。需要它是公开可获得的,但实际上只希望它设置为受保护的访问?没问题(从C#2开始,至少)。 想要在值发生变化时闯入调试器?只需在setter中添加断点即可。 想记录所有访问权限?只需将日志记录添加到getter即可。 属性用于数据绑定;字段不是。 这些都不是传统的"添加真正的逻辑"使用属性,但使用普通字段都很棘手/不可能。你可以在我需要的时候做到这一点"基础,但为什么不只是一致开始?对C#3的自动属性来说,这更加简单。
仅暴露属性的哲学原因
对于您编写的每种类型,您应该考虑它与世界其他地方的接口(包括同一程序集中的类)。这是它对可用内容的描述,它的外在角色。实施不应该是该描述的一部分,而不是绝对必须的。 (这就是为什么我更喜欢组合继承,选择有意义 - 继承通常会暴露或限制可能的实现。)
一个属性传达了"我将为您提供一个值,或接受您的价值。"它不是一个实现概念,它是一个接口概念。另一方面,一个字段传达了实现 - 它说"这种类型以这种非常具体的方式表示一个值"。没有封装,它是裸存储格式。这是领域不属于界面的部分原因 - 它们不属于那里,因为它们谈论的是如何实现某些事物而不是实现的目标。
我完全同意,在很多时候,字段实际上可以在应用程序的生命周期中使用而没有任何问题。事先并不清楚那些时代是什么,它仍然违反了不暴露实施的设计原则。