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