29

public static クラスに次のコードがあります。

public static class MyList
{
    public static readonly SortedList<int, List<myObj>> CharList;
    // ...etc.
}

..しかし、使用してもreadonly、別のクラスからリストにアイテムを追加できます。

MyList.CharList[100] = new List<myObj>() { new myObj(30, 30) };

また

MyList.CharList.Add(new List<myObj>() { new myObj(30, 30) });

CharList の実装を変更せずに読み取り専用にする方法はありますか (一部が壊れます)。実装を変更する必要がある場合 (変更不可にするため)、最善の方法は何ですか? List<T, T> である必要があるため、ReadOnlyCollection では実行できません

4

3 に答える 3

55

修飾子は、宣言またはコンストラクター以外で値を割り当てるreadonlyことができないことを意味します。割り当てられたオブジェクトが不変になるという意味ではありません。

オブジェクトを不変にしたい場合は、不変の型を使用する必要があります。あなたが言及した型ReadOnlyCollection<T>は、不変コレクションの例です。辞書で同じことを達成する方法については、この関連する質問を参照してください。

于 2012-04-08T21:34:32.260 に答える
3

readonly 修飾子は、変数 'CharList' をクラス コンストラクターの外部から別のものに再割り当てできないことを保証するだけです。public Add() メソッドを持たない独自の辞書構造を作成する必要があります。

class ImmutableSortedList<T, T1> 
{
    SortedList<T, T1> mSortedList;

    public ImmutableSortedList(SortedList<T, T1> sortedList) // can only add here (immutable)
    {
        this.mSortedList = sortedList; 
    }

    public implicit operator ImmutableSortedList<T, T1>(SortedList<T, T1> sortedList)
    {
        return new ImmutableSortedList<T, T1>(sortedList); 
    }
}

または、本当に実装を変更できない場合は、SortedList をプライベートにして、アクセスを制御する独自のメソッドを追加します。

class MyList
{
    // private now
    readonly SortedList<int, List<myObj>> CharList;

    // public indexer
    public List<myObj> this[int index]
    {
        get { return this.CharList[index]; }
    }
}
于 2012-04-08T21:43:15.210 に答える
1

リストには、読み取り専用リストを返すAsReadOnlyメソッドが必要です。

于 2012-04-08T21:39:13.983 に答える