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)
以下类传递M
给B<C, M>
public class MetaData : IMetaData
{
public UInt32 hashKey { set; get; }
}
Run Code Online (Sandbox Code Playgroud)
没有任何外部代码可以观察到这种类型的任何突变,这足以使它在常见的语言中被认为是"不可变的".它曾经变异的唯一时间是它自己的构造函数; 它一旦创建就永远不会变异,所以没有任何外部实体能够真正观察到类型的变异.几乎所有被认为是"不可变的"类型都是如此.
虽然该类型确实具有在其构造函数之外变异的技术能力,因为它具有不可readonly
变的两个字段List
,但它实际上从不执行任何此类突变或暴露任何变异数据的方法.
归档时间: |
|
查看次数: |
313 次 |
最近记录: |