I need to make my mutable class immutable, now it looks like this. However, nonetheless, I'm not sure that I have a completely βimmutableβ class, and if so, what immutability is it called?
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; } }
Based on my application, B needs to be changed from time to time; therefore, to preserve the immutability property, each update must be performed using the t Update function, which returns a brand new B
Update
To shed light on IMetaData , which was deliberately discovered by John Skeet, consider the following definitions:
public interface IMetaData { UInt32 hashKey { set; get; } }
and the next class is passed as M to B<C, M>
public class MetaData : IMetaData { public UInt32 hashKey { set; get; } }