我有一些C#代码喜欢创建具有setter但没有getter的属性。对我而言,这似乎是一种反模式,但我错过了一些东西吗?
public List<SiteVisitSummary> DataSource {
set {
// crazy logic here
}
}
答案 0 :(得分:16)
我不知道我是否称它为反模式。我认为重要的是要实现的是,示例中的属性本质上是一个方法,伪装成一个属性。出于这个原因,这是不直观的,我通常会避免它。对我来说,这看起来更自然:
public void SetDataSource(IEnumerable<SiteVisitSummary> dataSource)
{
// crazy logic here
}
我见过的一个非常合理的情况就是只设置属性是在将多个属性组合在一起时将all设置为单个值是合理的事情(但很明显,获取所有作为一个值没有意义)。例如:
class Polyhedron
{
public int Height { get; set; }
public int Width { get; set; }
public int Depth { get; set; }
public int AllDimensions
{
set { Height = Width = Depth = value; }
}
}
答案 1 :(得分:6)
它可能对Dependency Injection很有用,而不是使用构造函数进行注入,而是使用属性。
答案 2 :(得分:2)
虽然这对我来说没有多大意义,但我没有看到这种做法本来就有什么坏处。
封装的目的是限制可以改变对象状态的内容,以便状态变得更容易维护。我想不出有什么好的理由让房产只写。而且,如果可以的话,将其作为一种方法可能更有意义。
用户习惯于阅读属性,他们可能会浪费时间,想知道为什么你的财产如此奇怪。
答案 3 :(得分:1)
如果你期望有很多逻辑发生,那么通过使用一种方法来设置它会让成本更加清晰。
答案 4 :(得分:1)
这可能不是每个人的一杯茶,但我posted an answer to another question在那里我展示了使用“infuser”概念,在这种情况下是嵌套在不可变结构内部的结构。 infuser具有只写属性,可补充不可变类型的只读属性。
公平地说,我同意这种方法可能令人困惑,在将这样的代码包含在一个不仅仅是业余爱好项目的应用程序之前,我会三思而行。
这个概念对普通类也很有用,而不仅仅是不可变类型。它允许负责实例化对象的代码对该对象中包含的数据具有读/写访问权限。然后,该对象可以传递给其他代码,该代码具有对象内数据的只读访问权。
答案 5 :(得分:0)
这样的练习并不差,只是不太有用(你无法阅读的属性?)。
答案 6 :(得分:0)
这真是一种奇怪的事情。为什么要编写允许用户设置列表但不读取的API?如何返回一个ReadOnlyCollection并将该属性公开为IList而不是List?