如何使对象不可变

时间:2015-02-03 15:43:04

标签: c# .net

原始

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

是否有任何架构,模式来确保它。不可变,结构,只读没有什么是如此干净。或者我是否要求太多形式的流行语言?

被修改

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

1.是否有任何架构,模式来确保它。 不可变的模式,结构,只读 EF无法使用。 我是不是要求这么流行的语言?

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

4 个答案:

答案 0 :(得分:6)

没有任何会员可以更改您的课程内容,例如属性设置者(制作设置者private)。

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

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

基本示例:

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

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

答案 1 :(得分:0)

考虑您使用的所有值对象。约会是一个很好的。您可以将类的数据作为构造函数的一部分,并在构造时仅分配一次。正如已经指出的那样,您可以将属性字段设置为私有以设置和公共获取。对于状态更改功能,您可以从状态更改方法返回新实例。一个很好的例子是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

我发现这是最有效的模式,特别是当你开始需要状态改变逻辑时。在多线程环境中很棒。

答案 2 :(得分:0)

使Ef对象不可变的答案:

私人财产制定者。

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

Courtse - J.斯蒂恩

答案 3 :(得分:0)

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

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

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