Eric Lippert告诉我应该"尽量使值类型不可变",因此我认为我应该尽量使值类型不可变。
但是,在System.Web
程序集中,我刚刚发现了这个内部可变结构System.Web.Util.SimpleBitVector32
,这让我觉得一定有一个使用可变结构的好原因。我猜他们之所以这样做是因为在测试中表现更好,并将其保持为内部以防止滥用。然而,这只是猜测。
我已经复制并粘贴了这个结构的源代码。什么能够证明使用可变结构的设计决策是正确的?通常情况下,采用这种方法可以获得什么样的好处,什么时候这些好处足以证明潜在的不利影响合理呢?
[Serializable, StructLayout(LayoutKind.Sequential)]
internal struct SimpleBitVector32
{
private int data;
internal SimpleBitVector32(int data)
{
this.data = data;
}
internal int IntegerValue
{
get { return this.data; }
set { this.data = value; }
}
internal bool this[int bit]
{
get {
return ((this.data & bit) == bit);
}
set {
int data = this.data;
if (value) this.data = data | bit;
else this.data = data & ~bit;
}
}
internal int this[int mask, int offset]
{
get { return ((this.data & mask) >> offset); }
set { this.data = (this.data & ~mask) | (value << offset); }
}
internal void Set(int bit)
{
this.data |= bit;
}
internal void Clear(int bit)
{
this.data &= ~bit;
}
}