c# – 有一个简单的方法来创建一个不可变的版本的类吗?
有没有一个简单的方法来使一个实例不可变?
我们举一个例子,我有一个类持有大量数据字段(仅数据,没有行为): class MyObject { // lots of fields painful to initialize all at once // so we make fields mutable : public String Title { get; set; } public String Author { get; set; } // ... } 创作实例: MyObject CreationExample(String someParameters) { var obj = new MyObject { Title = "foo" // lots of fields initialization }; // even more fields initialization obj.Author = "bar"; return obj; } 但是现在我已经完全创建了我的对象,我不想让对象变得可变了(因为数据消费者永远不需要改变状态),所以我想要这样的东西List.AsReadOnly: var immutableObj = obj.AsReadOnly(); 但是如果我想要这个行为,我需要使另一个类具有完全相同的字段,但没有setter. 那么有什么自动的方式来产生这个不可变的类?或者另一种允许在创建过程中发生变异的方式,一旦初始化就可以变得不可 我知道这些字段可以被标记为“只读”,但该对象将被初始化在类之外,并将所有字段作为构造函数传递,似乎是一个坏主意(参数太多). 解决方法
不,没有什么简单的方法可以使任何类型不可变,特别是如果你想要“深度”不变性(即通过不可变对象无法达到可变对象的话).您将不得不明确地将您的类型设计为不可变的.使类型不可变的通常机制是:
>声明(属性支持)字段只读. (或者,从C#6 / Visual Studio 2015开始,使用read-only auto-implemented properties.) class FooBuilder // mutable version used to prepare immutable objects { public int X { get; set; } public List<string> Ys { get; set; } public Foo Build() { return new Foo(x,ys); } } class Foo // immutable version { public Foo(int x,List<string> ys) { this.x = x; this.ys = new List<string>(ys); // create a copy,don't use the original } // since that is beyond our control private readonly int x; private readonly List<string> ys; … } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |