在我看来,.NET存在极端缺乏安全,不可变的集合类型,特别是BCL,但我还没有看到很多工作在外面完成.有没有人有任何指向(优选)生产质量,快速,不可变的.NET集合库.快速列表类型是必不可少的.我还没准备好切换到F#.
*编辑:注意搜索者,很快就会进入BCL: .NET不可变集合
最近我一直在意识到(一些人会过度使用)不可变对象的好处,以大大减少我的对象模型中的读写依赖性问题及其产生的条件和副作用,最终使代码更易于管理(一种功能性编程式的.
这种做法使我创建了只读对象,这些对象在创建/构建时提供了值,然后只允许公共getter用于外部调用者访问属性.受保护的内部和私有设置器允许在写入对象模型时保持内部控制.
在通过我的对象模型创建API 时创建接口时,我已经开始考虑有关不变性的相同问题.例如,通过在我的接口上仅提供公共getter,并将其留给实现者来决定setter以及如何处理该方面.
我正在讨论的用于实现的"只读"接口的一个例子是这个有价值的项目(仅用于演示):
public interface IValuableItem {
decimal Amount {get;}
string Currency {get;}
}
Run Code Online (Sandbox Code Playgroud)
但是我想知道我应该如何提供一个允许写入的伴随接口(如果我应该),而不是在同一个接口中组合这些操作,以免"污染"它的不变性.
我想到了以下想法,就在我的脑海中.如果不提供我认为对每个人的利弊,你认为最好的方法是什么?是否有行业中常用的编码方法来管理这个概念?
// companion writer
public interface IValuableModifier {
decimal Amount {set;}
string Currency {set;}
}
Run Code Online (Sandbox Code Playgroud)
要么
// explicit methods to enforce importance of or deviance in the programming
public interface IValuableModifier {
void SetAmount(decimal val);
void SetCurrency(string cur);
}
Run Code Online (Sandbox Code Playgroud)
要么
// companion writer that inherits the original interface
public interface IValuableModifier : IValuableItem { //...
Run Code Online (Sandbox Code Playgroud)
要么
// …Run Code Online (Sandbox Code Playgroud) 考虑Foo结构如下:
struct Foo
{
public float X;
public float Y;
public Foo(float x, float y)
{
this.X = x;
this.Y = y;
}
public void Change(float x)
{
this.X = x;
}
}
Run Code Online (Sandbox Code Playgroud)
我理解修改构造函数中的字段,这对我和我理解结构作为值,类似数字的不可变类型是完全合乎逻辑的.
然而,因为可以T"做:
Foo bar = new Foo(1, 2);
bar.X = 5;
Run Code Online (Sandbox Code Playgroud)
为什么可以使用:
Foo bar = new Foo(1, 2);
bar.Change(5);
Run Code Online (Sandbox Code Playgroud)
编辑:如果结构是可变的,那么为什么它们不能在列表中修改或从属性返回?