什么是C#的“大部分完成”(im)可变性方法是什么?

由于不可变性并不完全融入到C#中,对于F#,或者完全进入框架(BCL),尽管在CLR中有一些支持,什么是C#的(im)可变性的一个相当完整的解决方案?

我的偏好顺序是一个由一般模式/原则兼容的解决方案

>一个具有少量依赖性的单一开源库
>少量补充/兼容的开源库
>商业广告

>涵盖Lippert的种类immutability
>提供体面的表现(这是模糊的我知道)
>支持序列化
>支持克隆/复制(深/浅/部分?)
>在诸如DDD,构建器模式,配置和线程之类的场景中感觉很自然
>提供不可变集合

我也想包括你作为社区可能出现的模式,不完全适合在一个框架,如expressing mutability intent through interfaces(其中两个客户端不应该改变的东西,可能想改变的东西只能通过接口,而不是支持类(是的,我知道这不是真正的不变性,但足够):

public interface IX
{
    int Y{ get; }
    ReadOnlyCollection<string> Z { get; }
    IMutableX Clone();
}

public interface IMutableX: IX
{
    new int Y{ get; set; }
    new ICollection<string> Z{ get; } // or IList<string>
}

// generally no one should get ahold of an X directly
internal class X: IMutableX
{
    public int Y{ get; set; }

    ICollection<string> IMutableX.Z { get { return z; } }

    public ReadOnlyCollection<string> Z
    {
        get { return new ReadOnlyCollection<string>(z); }
    }

    public IMutableX Clone()
    {
        var c = MemberwiseClone();
        c.z = new List<string>(z);
        return c;
    }

    private IList<string> z = new List<string>();       
}

// ...

public void ContriveExample(IX x)
{
    if (x.Y != 3 || x.Z.Count < 10) return;
    var c= x.Clone();
    c.Y++;
    c.Z.Clear();
    c.Z.Add("Bye, off to another thread");
    // ...
}
将更好的解决方案是只使用F#,你想要真正的不变性?
http://stackoverflow.com/questions/7663172/what-is-a-mostly-complete-immutability-approach-for-c

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:什么是C#的“大部分完成”(im)可变性方法是什么?