c# - 在不破坏不变性的情况下更改属性值

标签 c# immutability

我对保持不变性的最简洁方法感到很困惑。

这是迄今为止我得到的最简单和最愚蠢的方法,但我仍然想知道是否有更简单的方法来实现这一点

class MyClass
{
    public int Property1 { get; }
    public string Property2 { get; }

    public MyClass CopyWith(int? property1 = default, string property2 = default)
    {
        return new MyClass
        {
            Property1 = property1 ?? Property1,
            Property2 = property2 ?? Property2
        };
    }
}

class Program
{
    static void Main()
    {
        var myObj = new MyClass { Property1 = 123, Property2 = "123" };

        var myModifiedObj = myObj.CopyWith(property2: "456");
    }
}

使用泛型的扩展方法会涉及很多反射(reflection),但我仍然相信我想得太多了,也许我缺少一个更简单的解决方案......

最佳答案

要拥有不可变类您首先需要确保无法从外部访问其属性。所以我将其更改为:

class MyClass
{
    public int Property1 { get; }
    public string Property2 { get; }

    public MyClass(int prp1, string prp2)
    {
        Property1 = prp1;
        Property2 = prp2;
    }

    public MyClass With(int? property1 = default, string property2 = default) =>
        new MyClass(property1 ?? Property1, property2 ?? Property2);

}

这已经是一个很好的起点。正如您所说,使用泛型可能意味着过度设计您要解决的问题的代码。

有些人更喜欢对您要更改的每个属性使用一种方法,如果他们想更改多个属性,则将调用链接起来。这可能看起来有点冗长,但通常会产生更清晰的类。

看起来像这样:

class MyClass
{
    // until here it is the same as before

    public MyClass WithPrp1(int prp1) => new MyClass(prp1,Property2);
    public MyClass WithPrp2(string prp2) => new MyClass(Property1,prp2);   
}

class Program
{
    static void Main()
    {
        var myObj = new MyClass(123, "123");
        var myModifiedObj = myObj.WithPrp1(456).WithPrp2("789");
    }
}

关于c# - 在不破坏不变性的情况下更改属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60473734/

相关文章:

c# - Reactiveui 绑定(bind)不适用于 SeekBar.Progress

c# - 通用约束排除

java - 具有 setter/getter 的公共(public)类是否只是一个不可变类?

java - 从 Java Map<String, Object> propertyMap 添加条目的*副本*

database - 我应该用不可变或可变数据结构表示数据库数据吗?

如果我们只允许局部变量是可变的,我们可以防止共享可变状态吗?

c# - 如何使用 PDFsharp 将动态生成的位图插入到 PDF 文档中?

c# - System.IO.FileSystemWatcher.CompletionStatusChanged 处的 System.ArgumentOutOfRangeException

c# - Entity Framework Core 中的多态关系

immutability - 了解 Julia 中具有可变类型字段的不可变复合类型