如何使对象不可变

How to make an object immutable

原创

我有一个对象是 Ef 6.0 的结果。我有一个它的实例,想确保没有其他代码能够更改它的值。

有没有架构、模式可以确定。不可变的、结构的、只读的没有什么是那么干净。还是我对这种流行语言的要求太多了?

已编辑

我有一个对象是 Ef 6.0 的结果。 我有一个它的实例,想确保没有其他代码能够更改它的值。

1.Is 有什么架构、模式可以确定吗。 不可变模式,struct,readonly EF 无法使用任何内容。 这么通俗的语言,我是不是要求太多了?

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

没有任何成员可以更改您的 class 的内容,例如 属性 设置器(使设置器 private)。

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

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

基本示例:

public class X
{
    public X(string y)
    {
        this.y = y;
    }

    private readonly string y;
    public string Y { get { return y; } }
}

想一想您使用的所有值对象。日期是一个很好的。您可以将 class' 数据作为构造函数的一部分,并在构造时仅分配一次。正如已经指出的那样,您可以将 属性 字段设置为私有,将 public 设置为私有。对于状态更改功能,您可以 return 来自状态更改方法的新实例。一个很好的例子是 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 是我的实体。