请帮助解决这个问题。我有一个公共类,有一些属性。属性集是私有的,get是公共的。设置属性的唯一方法是调用构造函数。这种设计有什么好处或缺点?我应该知道有什么影响吗?我的论点是,如果私人套装没有任何好处,为什么呢? counter参数是在实例化类之后不需要更改属性,如果需要修改类以允许它。
这只是哲学还是背后有实际的技术推理?
public string Id
{
get;
private set;
}
更新:只是为了澄清这个问题。我不是在问私人套装是什么以及在哪里使用它。我问您是否不知道您的属性是否需要在构造函数之外进行更改,或者您是否从限制集合中获益。所以我想问题是,如果你不知道你要走哪条路,答案是否尽可能限制它?
答案 0 :(得分:6)
如果私人套装没有任何好处,为什么呢?
这是错误的看法。
公共设置器是功能。它必须经过设计,记录,测试和维护,或者您必须决定是否可以发送未经指定,未记录,未经测试和未维护的功能。我的管理层不会那么好,但也许你的是。你必须决定如果有人将它设置为null会发生什么,如果有人从另一个线程设置它会发生什么,等等。
由于公共制定者是有成本的东西,所以论证应该是“如果对公共制定者没有任何好处,那么我们必须将其设为私有,以避免添加没有任何好处的特征的成本。” / p>
公共制定者的成本高于显而易见的成本。公共设定者意味着您无法根据过去的值对当前属性的值进行任何逻辑推断。你必须假设任何人都可以随时改变这一点。您正在减少有关您的计划的已知事实的数量,从而增加您对该计划的某些部分理解错误的可能性。可变性使得程序更难以推理。
counter参数是在实例化类之后不需要更改属性。如果需要,修改类以允许它。
右。如果该功能为您购买没有任何好处,那么不要支付其费用!如果需要,那么就业务成本是否值得做出决定。
答案 1 :(得分:4)
最好的答案是,这取决于您的情况。班级的公共成员是与外界的合同。作为班级的设计师,你可以写合同。您是否想让人们改变房产的价值?如果没有,请将其设为私有。如果是这样,请公开。
如果不需要公开,请将其设为私有。就像在现实世界中一样,保持合同尽可能简单。不同意你不需要同意的任何事情。
答案 2 :(得分:1)
每当我需要一个类的“不变性”时,我就会这样做 - 它在该类的生命周期内无法改变。
此外,它可能不是改变属性的外部因素,甚至可能每次都计算。
公共获取/私人设置的许多好理由。