我有一堂课有两个readonly int
领域。它们作为属性公开:
public class Thing
{
private readonly int _foo, _bar;
/// <summary> I AM IMMUTABLE. </summary>
public Thing(int foo, int bar)
{
_foo = foo;
_bar = bar;
}
public int Foo { get { return _foo; } set { } }
public int Bar { get { return _bar; } set { } }
}
但是,这意味着以下代码完全合法:
Thing iThoughtThisWasMutable = new Thing(1, 42);
iThoughtThisWasMutable.Foo = 99; // <-- Poor, mistaken developer.
// He surely has bugs now. :-(
假设可以奏效的错误肯定是隐蔽的。当然,错误的开发人员应该已经阅读了文档。但这并不能改变没有编译或运行时错误就此问题警告过他的事实。
应该如何Thing
更改类,以使开发人员不太可能犯上述错误?
抛出异常?使用getter方法而不是属性?
6
不要声明不可变对象的接口
—
gnat'Gul
谢谢,@gnat。那个帖子(无论是问题还是答案)似乎都是在谈论接口,就像在Capital I中一样
—
kdbanman
Interfaces
。我不确定这就是我在做什么。
@gnat,那是可怕的建议。接口提供了一种很好的方式来维护仍然易于测试的公共不可变VO / DTO。
—
David Arno
@gnat,我做到了,这个问题没有意义,因为OP似乎认为接口会破坏不变性,这是胡说八道。
—
David Arno
@gnat,这个问题是关于声明DTO的接口。投票最多的答案是接口不会有害,但可能不必要。
—
保罗·德雷珀