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;}
这些是否已公开?我怀疑他们不是。
所以我的问题是打破封装是什么意思?
答案 0 :(得分:1)
从字段更改为属性是库的重大变化,因为访问字段的CIL与访问属性的CIL不同。如果您在编写库时希望获得属性的好处(可以将自动合成的getter / setter替换为其他属性),而无需重建世界,则需要对其进行规划并使用{ {1}}语法。
正如人们在评论中已经提到的那样,反思也存在一些差异,但它们通常不是你想要做的事情。