web-dev-qa-db-ja.com

ソケットを閉じた後、手動で廃棄する必要がありますか?

それでも、ソケットでDispose()を呼び出す必要がありますかafter閉じた後ですか?

例えば:

mySocket.Shutdown(SocketShutdown.Both);
mySocket.Close();
mySocket.Dispose(); // Redundant?

MSDNドキュメント が次のように言っているので、私は不思議に思っていました。

ソケット接続を閉じ、関連するすべてのリソースを解放します。

32
Kevin

Closeを内部的に呼び出すとDisposeが呼び出されるため、両方を呼び出す必要はありません。 。NET Reflector から:

public void Close()
{
    if (s_LoggingEnabled)
    {
        Logging.Enter(Logging.Sockets, this, "Close", (string) null);
    }
    ((IDisposable)this).Dispose();
    if (s_LoggingEnabled)
    {
        Logging.Exit(Logging.Sockets, this, "Close", (string) null);
    }
}

可能であれば、usingパターンを使用して、発生する可能性のある例外に関係なく、常にDisposeを呼び出すようにしてください。

38
Mark Byers

この場合、CloseとDisposeは同じです。 Msが.Net 1でDisposeパターンを導入したとき、Dispose Wordはあまり発見されませんでした。したがって、ガイドラインは、同じ機能を実行し、ユーザーがより簡単に見つけられるコンテキスト固有のキーワードを追加することでした。ファイルやソケットについてはCloseと同様です。

21
Alex Reitbort

慣例として、IDisposableを実装するものに対しては常にDisposeを呼び出す必要があります。あなたはそれが明白なものを超えて他に何をするかもしれないか決して知りません。

また、Reflectorを使用して、実際には現在それが必要ないことを確認した場合でも、内部実装がいつか変更される可能性があると想定しないでください。

Disposeを呼び出すことは決して害にはなりません。早くやれよ :)

6
Erv Walter

コードがより明確になるため、IDisposableオブジェクトを閉じることは、多くの場合、ベストプラクティスと見なされています。ただし、Disposeの明示的な呼び出しは、 (このページ で説明されているように、IDisposableの使用をusingステートメントでカプセル化すると自動的に行われます。

2
Andy

.NETにdisposeを呼び出させます。

using ( Socket mySocket = new Socket( ... ) ) {
  // Do stuff with socket, then bring it down nicely
}  // Dispose gets called returning the unmanaged system resources
0

あなたが正しいです。 disposeメソッドでは、ソケットのアンマネージリソースをクリーンアップするためにDispose()を呼び出す必要があると記述されているため、ドキュメントは明確ではありませんが、一方でCloseも同じようにする必要があります。 CloseがDisposeまたはそれとは逆の呼び出しをしていると思います。同じ動作がファイルでサポートされているので、これは経験に基づく推測です。

0
Ikaso