关于c#:自动实现的属性有什么意义?


What is the point of Auto-Implemented Properties?

本问题已经有最佳答案,请猛点这里访问。

例如,C中自动实现的属性的一个例子是:

1
 public double TotalPurchases { get; set; }

我理解它们是什么,正如他们所说,"编译器创建了一个私有字段,只能通过get和set访问该字段。"

我的问题是这有什么意义?

我的意思是,在其他语言中,重点是:你有一个变量,你把它设为私有的,然后你声明一些公共的函数,你可以通过它访问这个变量,而不是直接访问。为什么?好吧,因为你可以按照你想要的方式实现这个"变量",而你的类的用户对此一无所知,所以他只是得到并设置他看到的是类的一个属性。

但是在这里,尽管您有一个只能通过get和set访问的私有变量(如上所述),但您也有一个非常公共的变量,实际上您可以直接访问它,这就破坏了get和set的初衷。

我的意思是如果你想

1
cust1.TotalPurchases += 499.99;

为什么不

1
public double TotalPurchases;

完成了吗??

编辑:这个问题已被标记为"可能的副本",在我看来不是,我将尝试用我相当有限的英语解释为什么不是。

"可能的副本"的作者最初写了一种破坏完全封装的方法。后来他承认他"不能忍受写这么多",所以他只是使用公共领域。毕竟,他一开始并不关心封装。

我的职位完全相反。我想保持封装,因为正如我之前解释的那样,这给了我自由实现我认为合适的totalpurchases。我可以使用一个变量,但我可以从数据库中得到它,或者通过神经网络计算它。问题是我不希望用户对此视而不见。

但是,如果必须按照说明使用get和set,那么就必须声明一个公共变量,对吗?或者如果我这样做

1
private double TotalPurchases {get; set;}

这些是公开的吗?我怀疑他们不是。

所以我的问题是,破坏封装有什么意义?


从字段更改为属性对于库来说是一个突破性的更改,因为访问字段的CIL与访问属性的CIL不同。如果您想在编写库时获得属性的好处(也就是说,您可以将自动合成的getter/setter替换为执行其他操作的getter/setter),而不需要重新构建世界,那么您需要为其规划并使用{ get; set; }语法。

正如人们在评论中已经概述的那样,反思也有一些不同,但它们通常不是你想做的事情,也不是你想做的事情。