我可以称这个C#类为"不可变"吗?

Ham*_*med 6 c# mutable immutability

我需要使我的可变不可变,现在它看起来如下.但是,我仍然不确定我是否有一个完全"不可变的*类,如果是这样,那么这个叫做什么样的不变性

public class B<C, M>
        where C : IComparable<C>
        where M : IMetaData
{

    internal B(char tau, M metadata, B<C, M> nextBlock)
    {
        if (tau == 'R') omega = 1;
        _lambda = new List<Lambda<C, M>>();
        _lambda.Add(new Lambda<C, M>(tau: tau, atI: metadata));
        foreach (var item in nextBlock.lambda)
            if (item.tau != 'L')
                _lambda.Add(new Lambda<C, M>(tau: 'M', atI: item.atI));
    }

    internal int omega { private set; get; }
    private List<Lambda<C, M>> _lambda { set; get; }
    internal ReadOnlyCollection<Lambda<C, M>> lambda { get { return _lambda.AsReadOnly(); } }



    internal B<C, M> Update(int Omega, char tau, M metadata)
    {
        B<C, M> newBlock = new B<C, M>();
        newBlock.omega = Omega;
        newBlock._lambda = new List<Lambda<C, M>>(this._lambda);
        newBlock._lambda.Add(new Lambda<C, M>(tau: tau, atI: metadata));
        return newBlock;
    }

    internal B<C, M> Update(Dictionary<uint, Lambda<C, M>> lambdas)
    {
        B<C, M> newBlock = new B<C, M>();
        newBlock.omega = this.omega;
        newBlock._lambda = new List<Lambda<C, M>>();
        foreach (var l in lambdas)
            newBlock._lambda.Add(new Lambda<C, M>(tau: l.Value.tau, atI: l.Value.atI));

        return newBlock;
    }
}

public class Lambda<C, M>
        where C : IComparable<C>
        where M : IMetaData
{
    internal Lambda(char tau, M atI)
    {
        this.tau = tau;
        this.atI = atI;
    }

    internal char tau { private set; get; }
    internal M atI { private set; get; }
}
Run Code Online (Sandbox Code Playgroud)

根据我的申请B需要不时更改; 因此要保持不变性的属性,每次更新都需要通过Update返回全新的函数来完成B.

更新

为了阐明IMetaData这一点,Jon Skeet巧妙地发现了这一点,请考虑以下定义:

public interface IMetaData
    {
        UInt32 hashKey { set; get; }
    }
Run Code Online (Sandbox Code Playgroud)

以下类传递MB<C, M>

public class MetaData : IMetaData
    {
        public UInt32 hashKey { set; get; }
    }
Run Code Online (Sandbox Code Playgroud)

Ser*_*rvy 5

没有任何外部代码可以观察到这种类型的任何突变,这足以使它在常见的语言中被认为是"不可变的".它曾经变异的唯一时间是它自己的构造函数; 它一旦创建就永远不会变异,所以没有任何外部实体能够真正观察到类型的变异.几乎所有被认为是"不可变的"类型都是如此.

虽然该类型确实具有在其构造函数之外变异的技术能力,因为它具有不可readonly变的两个字段List,但它实际上从不执行任何此类突变或暴露任何变异数据的方法.