デフォルトでスレッドセーフなコレクション クラスを作成するとします。
内部的に、クラスには という保護されたList<T>
プロパティがありますValues
。
まず、クラスを実装することは理にかなっていますICollection<T>
。このインターフェイスのメンバーの一部は、実装が非常に簡単です。たとえば、 をCount
返しますthis.Values.Count
。
しかし、実装するには、(非ジェネリック)と同様ICollection<T>
に実装する必要があり、これはスレッドセーフなコレクションには少し注意が必要です。IEnumerable<T>
IEnumerable
もちろん、私はいつでもNotSupportedException
onIEnumerable<T>.GetEnumerator
とを投げることができましIEnumerable.GetEnumerator
たが、それは私にとって警官のように感じます.
getValues
ロックして配列Values
の形式でコピーを返すスレッドセーフ関数が既にあります。したがって、私の考えは、次のコードが実際にスレッドセーフになるように、返すことでT[]
実装することでした:GetEnumerator
this.getValues().GetEnumerator()
ThreadSafeCollection coll = new ThreadSafeCollection ();
// add some items to coll
foreach (T value in coll) {
// do something with value
}
残念ながら、この実装IEnumerable.GetEnumerator
は汎用バージョンではなく でのみ機能するようです (したがって、上記のコードは をスローしますInvalidCastException
)。
私が持っていた 1 つのアイデアは、それを呼び出す前にからのT[]
戻り値をキャストすることでした。代わりに、最初に を返すように変更することもできますが、非ジェネリックの場合は、戻り値を非ジェネリックにキャストするだけです。しかし、これらのアプローチがずさんな感じなのか、それとも完全に受け入れられるのか、私には判断できません。getValues
IEnumerable<T>
GetEnumerator
getValues
IEnumerable<T>
IEnumerable.GetEnumerator
getValues
IEnumerable
いずれにせよ、これを行う方法についてより良い考えを持っている人はいますか? メソッドについて聞いたことがありますが、名前空間.Synchronized
内の非ジェネリック コレクションでのみ使用できるようです。System.Collections
.NET に既に存在する、私が知らない一般的なバリアントがあるのではないでしょうか?