这闻起来了吗?
我有几个属性你只能设置一次。它们可以在对象存在期间随时设置,不能撤消。
我就这样实施了。
private FooThingy _foo;
public FooThingy Foo
{
set { if (null == _foo) _foo = value; }
get { return _foo; }
}但我不喜欢。我觉得我错过了什么。我有过吗?
编辑:为什么构造函数中没有它。
我无法深入到细节,但设置这一结果在<**bad analogy**>熔化蜡像<**/bad analogy**>.我不希望我的构造函数创建已经融化的对象。
发布于 2009-07-03 13:15:16
set --一次性属性违反了最小意外属性原则--调用方期望当属性可以设置一次时,可以再次设置属性。(当然,除了范围和兼容性检查之外-但是它们被绑定到特定的值或值组合中)。
在构造函数中初始化它们。
或者,如果它们需要编写所有构造函数,那么可以使用工厂/构建器类:
ThingieBuilder tb = new ThingieBuilder();
tb.FooThingy = 17.23; // r/w properties
tb.BarThingy = 42;
tb.UseExtendedThingamagicAdapter = true;
Thingie t = tb.Create();
if (t.Bar==42) // r/o property
...或者,分离配置对象中的设置,这些设置可以在构造过程中替换或传递。
发布于 2009-07-03 13:12:45
我认为,如果将这些值传递给构造函数,并将其公开为只读属性,则调用方将更加清楚。如果不能在构造时设置值,则如果再次设置值,则抛出异常可能是适当的:
private FooThingy _foo;
public FooThingy Foo
{
set
{
if (null == _foo) { _foo = value; }
else { throw new WhatEverThatFitsException(); }
}
get { return _foo; }
}需要非常清楚的是:I不以任何方式促进set一次性属性的使用;代码示例仅显示我可能使用的方法,如果由于任何原因在对象的构造时不能使用该值。尽管如此,在我参与的任何项目中,我从未遇到过这种情况。
发布于 2009-07-03 13:12:53
我建议把它们建在建筑上,这样就可以使设置者私人化。这似乎是一种更明智的方式。
如果你要这样做,抛出某种异常。至少让开发人员知道您没有设置他们的值,而不是默默地忽略它。
https://stackoverflow.com/questions/1079292
复制相似问题