9

ディクショナリを含む C# のクラスがあります。このディクショナリを作成し、それを含むクラスが存在する限り、このディクショナリから追加、編集、または削除されないようにしたいと考えています。

readonly は、後でアイテムを追加できることをテストして確認したら、実際には役に立ちません。たとえば、次の例を作成しました。

public class DictContainer
{
    private readonly Dictionary<int, int> myDictionary;

    public DictContainer()
    {
        myDictionary = GetDictionary();
    }

    private Dictionary<int, int> GetDictionary()
    {
        Dictionary<int, int> myDictionary = new Dictionary<int, int>();

        myDictionary.Add(1, 2);
        myDictionary.Add(2, 4);
        myDictionary.Add(3, 6);

        return myDictionary;
    }

    public void Add(int key, int value)
    {
        myDictionary.Add(key, value);
    }

}

Add メソッドが機能しないようにします。できればコンパイルすらしないようにしたいです。助言がありますか?

実際、多くの人に公開されるコードなので心配です。そのため、Add メソッドを非表示にしても、誰かがキーを追加したり、別のキーを削除したりするメソッドを「無邪気に」作成する可能性があります。私は人々に、決して辞書を変更してはならないことを知ってもらいたいと思っています。私がconst変数を持っているのと同じように。

4

7 に答える 7

8

辞書を完全に非表示にします。ディクショナリからアイテムを取得する DictContainer クラスに get メソッドを提供するだけです。

public class DictContainer
{
    private readonly Dictionary<int, int> myDictionary;

    public DictContainer()
    {
        myDictionary = GetDictionary();
    }

    private Dictionary<int, int> GetDictionary()
    {
        Dictionary<int, int> myDictionary = new Dictionary<int, int>();

        myDictionary.Add(1, 2);
        myDictionary.Add(2, 4);
        myDictionary.Add(3, 6);

        return myDictionary;
    }

    public this[int key]
    {
        return myDictionary[key];
    }
}
于 2009-05-12T16:56:09.107 に答える
2

Addメソッドを定義しないでください。

変数をプライベートに保ち、myDictionaryゲッター/インデクサーを公開して、そのクラスの外部からのみ読み取ることができるようにします..

于 2009-05-12T16:56:05.723 に答える
1

これを行う組み込みの方法はありません。ラッパー クラスの使用を検討してください。

于 2009-05-12T16:56:48.000 に答える
0
interface IReadOnlyDic<Key, Value>
{
    void Add(Key key, Value value);
}
class ReadOnlyDic<Key, Value> : Dictionary<Key, Value>, IReadOnlyDic<Key, Value>
{
    public new void Add(Key key, Value value)
    {
        //throw an exception or do nothing
    }
    #region IReadOnlyDic<Key,Value> Members

    void IReadOnlyDic<Key, Value>.Add(Key key, Value value)
    {
        base.Add(key, value);
    }

    #endregion
}

カスタムアイテムを追加する;

    IReadOnlyDic<int, int> dict = myDictInstance as IReadOnlyDic<int, int>;
    if (dict != null)
        dict.Add(1, 155);
于 2009-05-12T17:17:00.400 に答える
0

そしてこれは別の方法です

class ReadOnlyDic<Key, Value> : Dictionary<Key, Value>
{
    private bool _locked = false;

    public new void Add(Key key, Value value)
    {
        if (!_locked)
        {
            base.Add(key, value);
        }
        else
        {
            throw new ReadOnlyException();
        }
    }
    public void Lock()
    {
        _locked = true;
    }
}
于 2009-05-12T17:21:07.617 に答える