如何使对象不可变



Original

我有一个对象作为 Ef 6.0 的结果.我有一个实例,并希望确保没有其他代码能够更改其值。

是否有任何架构,模式来确保它。不可变,结构,只读,没有什么是那么干净。还是我对这种流行语言的要求太高了?

编辑

我有一个对象作为 Ef 6.0 的结果.我有一个实例,并希望确保没有其他代码能够更改其值。

1.Is 有任何架构,模式来确保它。不可变模式,结构,只读任何内容都可用于EF。我要求这种流行的语言太多了吗?

2.Is 有办法在完成所需的更改后锁定对象?

没有任何可以更改类内容的成员,例如属性 setters(使 setter private )。

不要让方法更改变量。(你应该让它们readonly可能)。

仅改变构造函数中的字段、属性和变量。

基本示例:

public class X
{
    public X(string y)
    {
        this.y = y;
    }
    private readonly string y;
    public string Y { get { return y; } }
}

想想你使用的所有值对象。 日期是个好。您可以将类的数据作为构造函数的一部分,并在构造时仅分配一次。如前所述,您可以将属性字段设为私有以设置,并将公共字段设为获取。对于状态更改功能,可以从状态更改方法返回新实例。一个很好的例子是 DateTime 上的 AddDays 方法。这会保持原始日期不变,但会返回一个新日期,并将适当的日期添加到原始日期时间。

Var date = new DateTime(2015,01,01);
Var newDate = date.AddDays(15);
// date is now 2015,01,01
// newDate is now 2015,01,16

我发现这是最有效的模式,尤其是当您开始需要状态更改逻辑时。非常适合多线程环境。

使 Ef 对象不可变的答案:

私人财产设置者。

 public class Users
    {
        public int Id { get;private set; }
        public string FirstName { get;private set; }
        public string LastName { get; private set; }
    }

考特斯– J. 斯蒂恩

这是一个

老问题,但我遇到了同样的问题,并提出了以下解决方案,将其留在这里,以便其他人将来可能会受益:

OriginalData = Context.Entry(MyBindingSource.Current).CurrentValues.ToObject();

请注意,MyBindingSource.Current 是我的实体。

最新更新