1

ConcurrentDictionary をカプセル化するカスタム コレクションを作成しています。一般的なコレクションからのカプセル化/継承に関する多くの情報を見つけましたが、並行コレクションに固有のものは何も見つかりませんでした。これは私の基本ケースのコード スニペットであり、その後にいくつかの一般的な質問が続きます。

class ItemCollection
{
    private ConcurrentDictionary<string, Item> Collection;        

    public ItemCollection() { Collection = new ConcurrentDictionary<string, Item>(); }

    public bool TryAdd(string webId, string name) { return Collection.TryAdd(webId, new Item(name)); }
    public bool TryAdd(string webId, Item item) { return Collection.TryAdd(webId, item); }
    public bool TryUpdate(KeyValuePair<string, Item> entry, Data data) 
    {
        Item newItem = entry.Value;
        newItem.AddData(data);            
        return Collection.TryUpdate(entry.Key, newItem, entry.Value);
    }
}
  • この方法で並行コレクションをカプセル化することは許容されますか? それとも、ジェネリック コレクションから独自のスレッド セーフ コレクションを作成する領域に移行するのでしょうか?
  • カスタム コレクションはスレッドセーフですか?
  • 並行コレクションの継承は受け入れられますか? そうであれば、非並行コレクションから継承するためのこれclass ItemCollection : ConcurrentDictionary<string, Item>に似た、いくつかのガイドラインは何ですか。
  • Select のようなメソッドの転送メソッドをどのように実装しますか? 次のような一連のバリエーションを試しましたが、機能しません。

public IEnumerable<TResult> Select<ItemCollection, TResult>(this ItemCollection source, Func<KeyValuePair<string, Item>, TResult> selector) { return Collection.Select(selector); }

ConcurrentDictionary を継承すると、次のような実装になります ここに画像の説明を入力

4

1 に答える 1

1

質問は「広すぎる」に隣接しています。とはいえ、いくつかの基本的な答えを提供できます。詳細については、質問をさらに絞り込み、より小さく、より具体的な問題を一度に扱い、できればそれらの質問を個別に提示する必要があります。

その間:

この方法で並行コレクションをカプセル化することは許容されますか? それとも、ジェネリック コレクションから独自のスレッド セーフ コレクションを作成する領域に移行するのでしょうか?

「許容できる」というのは広い概念ですが…そうです、アプローチに根本的な間違いはありません。

カスタム コレクションはスレッドセーフですか?

「スレッドセーフ」はあいまいな用語です。しかし、一般的に、私は「はい」と言います。クラスは独自の状態をまったく維持せず、代わりにすべての状態をスレッドセーフなクラスに委譲します。そのため、スレッド セーフに関する通常の懸念事項については、クラスの状態自体は問題ないはずです。

このTryUpdate()メソッドは、渡されたオブジェクトも変更することに注意してください。これは、スレッドセーフな方法では行われません。ただし、それはコレクションではなく、そのオブジェクトのスレッド セーフに関するものです。

並行コレクションの継承は受け入れられますか? 同様に、クラス ItemCollection : ConcurrentDictionary と、そうであれば、非並行コレクションから継承するためのこれと同様のガイドラインは何ですか。

シールされていないクラスを継承することは常に「許容」されます。それが役に立つかどうかは別問題です。継承は、継承されたクラスが、継承されたクラスの動作を実際に拡張または変更するために派生クラスが使用できる便利な保護されたメンバーや仮想メンバーを持っている場合に最も役立ちます。

それ以外の場合は、多くの場合、拡張メソッドの方が優れたアプローチです。

いずれにせよ、コレクションがスレッドセーフかどうかによって、コレクションの継承に関するガイダンスが大きく変わるとは思いません。

Select のようなメソッドの転送メソッドをどのように実装しますか? 次のような一連のバリエーションを試しましたが、機能しません。

「Select() のようなメソッド」は拡張メソッドとして実装され、オブジェクト自体の実装に依存しますIEnumerable<T>(そのようなメソッドの一部でIEnumerableは十分です)。カスタム コレクションでこれらのメソッドを使用できるようにする場合は、クラスで使用する拡張メソッドに適切なインターフェイスを実装する必要があります。

当然のことながら、インターフェイスの実装では、実際の操作をカプセル化されたコレクションに委譲できます。

于 2015-07-07T21:42:01.570 に答える