Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使对象不可变_C#_.net - Fatal编程技术网

C# 如何使对象不可变

C# 如何使对象不可变,c#,.net,C#,.net,原创 我有一个对象作为Ef 6.0的结果。我有它的一个实例,希望确保没有其他代码能够更改它的值 是否有任何架构、模式来确保它。不可变的,结构化的,只读的没有什么比这更干净的了。还是我对这种流行语言要求太高 已编辑 我有一个对象作为Ef 6.0的结果。 我有它的一个实例,希望确保没有其他代码能够更改它的值 1.是否有任何架构、模式来确保它。 不可变模式、结构、只读任何东西都不能与EF一起使用。 我对这种流行语言要求太高了吗 2.是否有方法在完成所需更改后锁定对象?没有任何成员可以更改类的内容,如属

原创

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

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

已编辑

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

1.是否有任何架构、模式来确保它。 不可变模式、结构、只读任何东西都不能与EF一起使用。 我对这种流行语言要求太高了吗


2.是否有方法在完成所需更改后锁定对象?

没有任何成员可以更改类的内容,如属性设置器(将设置器设置为私有的)

不要让方法改变你的变量。(您应该将它们设置为
readonly

仅对构造函数中的字段、属性和变量进行变异

基本示例:

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

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

没有任何成员可以更改类的内容,比如属性设置器(将设置器设置为私有的)

不要让方法改变你的变量。(您应该将它们设置为
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

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

想想你使用的所有价值对象。约会是个好日子。您可以将类的数据作为构造函数的一部分,并在构造时只分配这些数据一次。如前所述,您可以将属性字段设置为私有以进行设置,将属性字段设置为公共以进行获取。对于状态更改功能,可以从状态更改方法返回新实例。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.Steen

关于使Ef对象不可变的答案:

私有财产设定者

 public class Users
    {
        public int Id { get;private set; }
        public string FirstName { get;private set; }
        public string LastName { get; private set; }
    }
科特斯
–J.Steen

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

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

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

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

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


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

私有属性设置器?只读不干净?单例设计模式?@mickey:Singleton可以是可变的。“EF不可用”表明,如果您不希望代码修改EF实体,你不应该到处传递它们-你可以构建由EF实体支持的域对象,这些实体本身是不可变的,没有问题。私有属性设置器?只读不是干净的?单例设计模式?@mickey:Singleton可以是可变的。“EF不可用”表明,如果你不希望代码修改EF实体,您不应该到处传递它们-您可以构建由EF实体支持的域对象,这些实体本身是不可变的,不会有任何问题。@L33TS:如果您初始化一个对象,则不会根据定义对其进行修改。应该注意的是,如果您的类包含可变对象的实例,则外部代码仍可以修改这些实例;e、 例如,如果您的类拥有一个
List
的实例,即使您只向您的成员公开一个getter,外部代码仍然能够修改该列表。在本例中,您可以使用
ReadOnlyList
包装类来构建一个真正不可变的类,但是如果您公开的类型本身是可变的,您可能需要创建自己的只读包装。@PrestonGuillot:谢谢。有用的补充@雷霆:这是以前没有的新要求。你问过如何使它不可变。如果您不想让它变成那样(通过赋予不可变的另一个含义),您应该清楚地说明这一点。@Patrickhoffman为了清楚起见,我已经包括了原始问题。@L33TS:如果您初始化一个对象,您不会根据定义对其进行变异。应该注意的是,如果您的类包含可变对象的实例,外部代码仍然可以修改这些实例;e、 例如,如果您的类拥有一个
List
的实例,即使您只向您的成员公开一个getter,外部代码仍然能够修改该列表。在本例中,您可以使用
ReadOnlyList
包装类来构建一个真正不可变的类,但是如果您公开的类型本身是可变的,您可能需要创建自己的只读包装。@PrestonGuillot:谢谢。有用的补充@雷霆:这是以前没有的新要求。你问过如何使它不可变。若你们不希望它是那个样的(通过赋予不可变的另一种含义),你们应该把它弄清楚。@Patrickhoffman为了清楚起见,我已经包括了最初的问题。那个会的