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

  • 本文关键字:实现 属性 c#
  • 更新时间 :
  • 英文 :


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

public double TotalPurchases { get; set; }

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

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

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

但是在这里,虽然你有一个只能通过get和set访问的私有变量(与上面相同),但你有一个非常公共的变量,实际上你直接访问,首先违背了get和set的目的。

我的意思是,如果你要做

cust1.TotalPurchases += 499.99;

为什么不干脆有

public double TotalPurchases;

并完成它??

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

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

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

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

private double TotalPurchases {get; set;}

这些获取和设置是否公开?我怀疑他们不是。

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

从字段更改为属性是库的重大更改,因为访问字段的 CIL 与访问属性的 CIL 不同。如果你想要在编写库时获得属性的好处(也就是说,你可以用一个做其他事情的 getter/setter 替换自动合成的 getter/setter),而不需要重建世界,你需要计划它并使用{ get; set; }语法。

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

最新更新