自动实现的属性有什么意义?

时间:2017-07-05 09:20:17

标签: c#

C#中的Auto-implemented properties示例是:

 public double TotalPurchases { get; set; }

我理解它们是什么,正如他们所说的那样,#34;编译器会创建一个只能通过get和set访问的私有字段。

我的问题是有什么意义?

我的意思是在其他语言中,重点是:你有一个变量,你做私人,然后你声明一些函数 public ,通过它你可以访问该变量 - 永远不要直接。为什么?好吧因为那样你就可以实现"变量"你想要的方式和你班级的用户都不知道,他只是得到并设定他所看到的是班级的财产。

但是在这里,虽然你有一个私有变量,只能通过get和set访问(与上面相同),你有一个非常公开的变量,实际上你可以直接访问,从而破坏了目的得到并设置在第一位。

我的意思是你打算做什么

cust1.TotalPurchases += 499.99;

为什么不只是

public double TotalPurchases;

并完成它?

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

"可能重复的作者"最初写了一种打破完全封装的方式。后来他承认他“不能写下所有这些"所以他只是用公共场地。毕竟他一开始并不关心封装。

我的帖子完全相反。我想保持封装,因为正如我之前所解释的那样,这让我可以自由地实现TotalPurchases。我可以使用变量,但我可以从数据库中获取,或通过神经网络计算。问题是我不希望用户忘记这一点。

但是,如果我必须按照说明使用get和set,我被迫声明一个公共变量吧? 或者如果我这样做

private double TotalPurchases {get; set;}

这些是否已公开?我怀疑他们不是。

所以我的问题是打破封装是什么意思?

1 个答案:

答案 0 :(得分:1)

从字段更改为属性是库的重大变化,因为访问字段的CIL与访问属性的CIL不同。如果您在编写库时希望获得属性的好处(可以将自动合成的getter / setter替换为其他属性),而无需重建世界,则需要对其进行规划并使用{ {1}}语法。

正如人们在评论中已经提到的那样,反思也存在一些差异,但它们通常不是你想要做的事情。