自动属性建立在属性之上。
C# 中的属性是一种语言特性,而在 Java 中它们是一种约定(以 get 或 set 开头的方法通常被人们谈论代码时视为属性,但对于编译器而言,它与 foo 或 bar 没有什么不同)。
.NET 及其相关语言在许多方面都基于 COM(有时效仿,有时故意不在COM 中做一些出于某种原因或其他不受欢迎的事情)。
COM 有一个属性概念,在 VB 中它由语言特性支持(在 C++ 中它由约定支持)。
VB 的早期版本,特别是在它用于提供对从其他地方提供的对象模型的基本编程访问的上下文中,旨在简化呈现给用户的对象模型,以区分字段和获取或设置的方法(可能额外的工作,也许不是)不重要的(考虑到虽然它们在 .NET 中与外部在某些重要方面有所不同,但在语法上访问属性和公共字段是相同的)。当 VB 和 COM(以及在此之前的 OLE)长大后,它们一起长大。
所以总而言之,虽然 C# 与 Java 共享 C/C++ 继承,但它也具有 Java 不共享的继承,这使得属性对于 C# 的创建者来说似乎是个好主意,但对 Java 来说却不是。
编辑:起初我说:
就个人而言,我认为自动属性确实是一种解决属性缺陷的方法,而不是一种简化代码的方法。属性在语法上“看起来”像公共字段,但不完全是(尝试使用DataBinder.Eval
来检索字段)。如果一个属性是完全公开的,并且在 getter 或 setter 中没有额外的功能(自动属性就是这种情况),我宁愿只拥有一个公共字段(封装在这里没有参数,因为它完全公开公开 -无论如何都通过了),但是字段和属性之间的差异与此相反。
我收回那句话。使字段与属性完全一样需要简单的 Plain-Old-Data 结构的字段像属性一样工作,这会导致性能松散。从概念上讲,我希望他们更像彼此,但每当我想到它时(我已经从恼火变成了不止一次像这里一样“哦等等”),这样就更好了。