Почему это нормально, что эта структура изменяема? Когда приемлемы изменяемые структуры?

Эрик Липперт сказал мне, что я должен «стараться всегда делать типы значений неизменяемыми» , поэтому я решил, что должен стараться всегда создавать типы значений неизменный.

Но я только что нашел эту внутреннюю изменяемую структуру 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;
    }
}

35
задан smartcaveman 13 November 2011 в 01:33
поделиться