5

混乱していて、何か簡単なものが欠けている可能性があります。

私が持っている

var q = new Queue<object>();
lock (q.SyncRoot)
{
    ...
}

私は得る

Queue<T> does not provide a defintion for SyncRoot blah blah...

しかし、パブリックプロパティとして定義するをQueue<T>実装します。ICollectionSyncRoot

それで、まず第一に、なぜこれが隠されているのですか。次に、実装しているインターフェイスのプロパティを非表示にするにはどうすればよいですか?

4

2 に答える 2

6

プロパティを明示的に実装することで、プロパティを非表示にできます。

    object MyQueue.SyncRoot { get; set; }

非推奨であるため非表示になっています:

SyncRootベースの同期APIは、ほとんどのシナリオで柔軟性が不十分であることがわかりました。APIを使用すると、コレクションの1つのメンバーにスレッドセーフにアクセスできます。問題は、複数の操作をロックする必要があるシナリオが多数あることです(たとえば、1つのアイテムを削除して別のアイテムを追加する)。つまり、通常、コレクション自体ではなく、適切な同期ポリシーを選択する(そして実際に実装できる)コレクションを使用するコードです。SyncRootが実際に使用されることは非常にまれであり、使用された場合、実際にはあまり価値がないことがわかりました。使用されていない場合は、ICollectionの実装者にとっては煩わしいだけです。

于 2012-10-05T13:02:59.260 に答える
3

これは「明示的なインターフェースの実装」の例です。

インターフェイスを明示的に実装する場合、そのインスタンスのそのタイプの参照を介してのみそのメソッドにアクセスできます。つまり、これをにキャストするQueueICollection、同期ルートメンバーが表示されます。

于 2012-10-05T13:02:14.043 に答える