Эрик Липперт сказал мне, что я должен "стараться всегда делать типы значений неизменяемыми" , поэтому я решил, что должен стараться всегда делать типы значений неизменяемыми.
Но я только что нашел эту внутреннюю мутирующую структуру, System.Web.Util.SimpleBitVector32
, в сборке System.Web
, которая заставляет меня думать, что должна быть веская причина иметь изменяемую структуру. Я предполагаю, что они сделали это таким образом, потому что он работал лучше под тестированием, и они сохранили его внутреннее, чтобы препятствовать его неправильному использованию. Впрочем, это спекуляция.
У меня есть C & P'd источник этой структуры. Что оправдывает конструктивное решение использовать изменчивую структуру? В целом, какие выгоды могут быть достигнуты при подходе и когда эти преимущества достаточно значительны, чтобы оправдать потенциальные недостатки?
[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;
}
}