C# 公共属性中的私有集方法

C# 公共属性中的私有集方法,c#,.net,C#,.net,请帮助解决这个争论。我有一个带有一些属性的公共类。属性集是私有的,get是公共的。设置属性的唯一方法是调用构造函数。这种设计的优点或缺点是什么?有什么我应该知道的暗示吗?我的论点是,如果私人设置没有好处,为什么要这样做?相反的论点是,如果需要修改类以允许它,则在实例化类之后不需要更改属性 这仅仅是哲学上的,还是背后有实际的技术推理 public string Id { get; private set; } 更新:只是为了澄清这个问题。我不是在问什么是私人设置以及在哪里使用它。

请帮助解决这个争论。我有一个带有一些属性的公共类。属性集是私有的,get是公共的。设置属性的唯一方法是调用构造函数。这种设计的优点或缺点是什么?有什么我应该知道的暗示吗?我的论点是,如果私人设置没有好处,为什么要这样做?相反的论点是,如果需要修改类以允许它,则在实例化类之后不需要更改属性

这仅仅是哲学上的,还是背后有实际的技术推理

public string Id
{
    get;
    private set;
}

更新:只是为了澄清这个问题。我不是在问什么是私人设置以及在哪里使用它。我想问的是,你是否不知道你的属性是否需要在构造函数之外进行更改,你是否从限制集合中得到了好处。所以我想问题是,如果你不知道你要走哪条路,那么答案是尽可能地限制吗?

最好的答案是,这取决于你的情景。类的公共成员是它与外部世界的契约。作为课程的设计者,你需要写合同。是否允许人们更改财产的价值?如果没有,就保密。如果是的话,就公开


如果它不需要公开,就把它变成私人的。就像在现实世界中一样,让合同尽可能简单。不要同意任何你不需要同意的事情。

最好的答案是,这取决于你的情况。类的公共成员是它与外部世界的契约。作为课程的设计者,你需要写合同。是否允许人们更改财产的价值?如果没有,就保密。如果是的话,就公开


如果它不需要公开,就把它变成私人的。就像在现实世界中一样,让合同尽可能简单。不要同意任何你不需要同意的事情。

每当我需要一个类的“不变性”时,我都会这样做——它不能在该类的生命周期内改变

而且,它可能不是一个改变属性的外部事物,它甚至可能每次都被计算


公共get/private set有很多很好的理由。

每当我需要一个类的“不变性”时,我都会这样做——它不能在该类的生存期内更改

而且,它可能不是一个改变属性的外部事物,它甚至可能每次都被计算

公共获取/私有设置有很多很好的理由

如果私有设置没有好处,为什么要这样做

这是错误的看法

公共setter是一个特性。它必须经过设计、记录、测试和维护,或者您必须决定是否可以提供未设计、未记录、未测试和未维护的功能。我的管理层不会同意,但也许你的管理层会同意。您必须决定如果有人将其设置为null会发生什么,如果有人从另一个线程将其设置为null会发生什么,等等

既然公共setter是有成本的东西,那么争论应该是“如果公共setter没有好处,那么我们必须将其私有化,以避免添加没有好处的特性的成本。”

公共决策者比那些显而易见的决策者有更多的成本。公共设置器意味着您不能基于过去的值对当前属性的值进行任何逻辑推断。你必须假设任何人都可能在任何时候改变这件事。您正在减少关于您的程序的已知事实的数量,因此增加了您对该程序的某些理解是错误的可能性。易变性使程序更难推理

反参数是,在实例化类之后,不需要更改属性。如果需要,修改类以允许它

对。如果该功能没有为您带来任何好处,那么就不要支付其成本!如果需要,那么就做出一个关于成本是否值得的商业决策

如果私有设置没有好处,为什么要这样做

这是错误的看法

公共setter是一个特性。它必须经过设计、记录、测试和维护,或者您必须决定是否可以提供未设计、未记录、未测试和未维护的功能。我的管理层不会同意,但也许你的管理层会同意。您必须决定如果有人将其设置为null会发生什么,如果有人从另一个线程将其设置为null会发生什么,等等

既然公共setter是有成本的东西,那么争论应该是“如果公共setter没有好处,那么我们必须将其私有化,以避免添加没有好处的特性的成本。”

公共决策者比那些显而易见的决策者有更多的成本。公共设置器意味着您不能基于过去的值对当前属性的值进行任何逻辑推断。你必须假设任何人都可能在任何时候改变这件事。您正在减少关于您的程序的已知事实的数量,因此增加了您对该程序的某些理解是错误的可能性。易变性使程序更难推理

反参数是,在实例化类之后,不需要更改属性。如果需要,修改类以允许它


对。如果该功能没有为您带来任何好处,那么就不要支付其成本!如果需要,那么就做出一个关于成本是否值得的业务决策。

如果您希望能够从类内部更改属性,该怎么办?主要原因只是为了对其他类隐藏setter。因此,没有人可以通过这个变量来影响类的逻辑参见:不清楚您建议的替代方案是什么-您已经展示了一段代码,询问它比其他东西好还是坏,但没有说什么东西是什么