假设该场景不允许实现不可变类型。根据这个假设,我想要关于如何正确设计一种类型的意见/示例,该类型在使用后变得不可变。
public class ObjectAConfig {
private int _valueB;
private string _valueA;
internal bool Consumed { get; set; }
public int ValueB {
get { return _valueB; }
set
{
if (Consumed) throw new InvalidOperationException();
_valueB = value;
}
}
public string ValueA {
get { return _valueA; }
set
{
if (Consumed) throw new InvalidOperationException();
_valueA = value;
}
}
}
When ObjectA
消耗ObjectAConfig
:
public ObjectA {
public ObjectA(ObjectAConfig config) {
_config = config;
_config.Consumed = true;
}
}
我不满意这只是有效的,我想知道是否有更好的模式(排除,如上所述,使ObjectAConfig
从一开始就设计为不可变)。
例如:
您正在实施的内容有时会以“冰棒不变性 http://blogs.msdn.com/b/ericlippert/archive/2007/11/13/immutability-in-c-part-one-kinds-of-immutability.aspx“ - 即你可以冻结它。你目前的方法将工作- 事实上,我自己在很多地方都使用了这种模式。
您可以通过以下方式减少一些重复:
private void SetField<T>(ref T field, T value) {
if (Consumed) throw new InvalidOperationException();
field = value;
}
public int ValueB {
get { return _valueB; }
set { SetField(ref _valueB, value); }
}
public string ValueA {
get { return _valueA; }
set { SetField(ref _valueA, value); }
}
不过,还有另一种相关方法:构建器。例如,参加您现有的课程:
public interface IConfig
{
string ValueA { get; }
int ValueB { get; }
}
public class ObjectAConfig : IConfig
{
private class ImmutableConfig : IConfig {
private readonly string valueA;
private readonly int valueB;
public ImmutableConfig(string valueA, int valueB)
{
this.valueA = valueA;
this.valueB = valueB;
}
}
public IConfig Build()
{
return new ImmutableConfig(ValueA, ValueB);
}
... snip: implementation of ObjectAConfig
}
这里有一个真正不可变的实现IConfig
,以及您的原始实现。如果您想要冻结版本,请致电Build()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)