2009-04-02 15 views
1

Socket.Dispose()はアクセスできないメンバーです。しかし、我々は次のようにして、これをバイパスすることができます:どのようにC#でカプセル化を隠すのですか?

((IDisposible)Socket).Dispose() 

つの質問:

  1. は、なぜこれが許可されていますか?
  2. これは内部的にどのように機能しますか?

答えて

5

この機能は「明示的なインターフェイスの実装」と考えられます。これを使用すると、オブジェクトがインターフェイスに明示的にキャストされている場合にのみ、実装されたメソッドを呼び出すことができます。クラスは、廃棄(同じ仕事を達成閉じる())などのメソッドを実装するたびに、明示的にIDisposableインターフェイスを実装することをお勧めします

http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx

+0

いやを参照してください....例えば、ソケットのためにこの背後にあるものです、理にかなっていますか? thx –

+0

この投稿をチェックしてください:http://stackoverflow.com/questions/280495/why-to-use-explicit-interface-implementation-to-invoke-a-protected-method –

+0

私は理解できません。つまり、SocketはIDisposableを実装していますが、何らかの理由で、デザイナーはクラスの「公開API」に「Dispose()」メソッドを必要としませんでした。 Disposeを使用するには、ソケットをIDisposableにキャストする必要があります。 –

3

は、ここでは、この上のチュートリアルです開発者は通常、Close()メソッドのみを参照しますが、Disposeメソッドは、Disposeメソッドが必要なフレームワークで使用するために、IDisposableインターフェイスを通じて引き続きアクセスできます。

場合によっては、Disposeを閉じるなどの別の名前で公開して、より読みやすいコードにすることができます。これらは、ファイルハンドルや接続など、「閉鎖」可能なもので、.NET Framework全体で表示されます。

編集:http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756

+0

+1、しかし、あなたはこの勧告の参考資料を持っていますか?または、新しいクラスの例? System.IO.StreamにはDisposeとCloseの両方があります。 –

+0

.NET Frameworkを作成したのと同じ人が書いた、.NET Framework Design Guidelinesという本にあります。 – AaronLS

関連する問題