質問

いクラスのクライアントまで、フルのC#と、辞書を作りたいを確保するものとしての追加-編集-削除この辞書にクラスを含む世界最大の国際人権ngoです。

読み取り専用くださで見ることができま項目を追加します。ったとえば、作成した例

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);
    }

}

またの追加方法はない。できればいいってもコンパイル。ご意見募集

実は、私のあるコードますということを多くの人たちに変化します。なので、とっても非表示の追加方法では、する可能性が高いことがわかる人は"無邪気"を作る方法キーの追加又は削除します。していきたい、知らな変化の辞書いますのようにしている定数の変数となります。

役に立ちましたか?

解決

にあります。NETフレームワークできますが、 このポスト この良い実装の一般的 ReadOnlyDictionary クライアントまで、フルのC#.を実装するすべてのインタフェースはあなたが期待するかもしれない(IDictionary, ICollection, IEnumerable, 等) としてボーナスの全体クラスのメンバーに完全な形式をサポートしています。

(私は控えの中からのコードはこちらでもかなり長いとすべてのXMLコメントなし。)

他のヒント

完全に辞書を非表示にします。ただ、辞書からアイテムを取得する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];
    }
}

え...その後、Addメソッドを定義していない...

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

彼は完全にの

ポイントを欠けている場合は、

の不思議

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);

これは別の方法です。

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;
    }
}

私はリンクを言っています> 1単純だったが、私は答えとしての彼のコメントをマークすることはできません一度ブルーノ・コンデの、からそれは類似しており、満足のいく答えであるため、私は、公式のよう Noldorin の答えをマークします。

残念:(コンパイルからコードを防止するための方法はありません。おかげで、みんな

ここで私が説明したように、より良い選択肢があります:

http://www.softwarerockstar.com/2010/10/する ..

基本的に、それはよりエレガントな方法で行われた作業を取得ReadOnlyCollectionを、サブクラスはるかに簡単なソリューションです。

FYI、今では内蔵されて4.5を.NETにます。

http://msdn.microsoft.com /en-us/library/gg712875(v=vs.110).aspxする

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top