Должен ли я вручную утилизировать сокет после его закрытия? - PullRequest
31 голосов
/ 30 августа 2010

Должен ли я все еще вызывать Dispose() в моем сокете после закрытия его?

Например:

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

Мне было интересно, потому что MSDNдокументация гласит следующее:

Закрывает соединение сокета и освобождает все связанные ресурсы.

Ответы [ 6 ]

38 голосов
/ 30 августа 2010

Внутренний вызов 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 независимо от возможных исключений.

21 голосов
/ 30 августа 2010

Close и Dispose одинаковы в этом случае.Когда госпожа ввела шаблон Dispose в .Net 1, слово Dispose было не очень доступно для обнаружения.Таким образом, рекомендация заключалась в том, чтобы добавить контекстно-зависимое ключевое слово, которое будет выполнять те же функции и которое будет легче обнаружить пользователям.Нравится Close для файлов и сокетов.

6 голосов
/ 30 августа 2010

По соглашению, вы всегда должны вызывать Dispose для всего, что реализует IDisposable.Вы никогда не знаете, какие другие вещи это может сделать, кроме очевидного.

И если вам случится использовать Reflector, чтобы увидеть, что на самом деле он сейчас не нужен, вы не должны предполагать, что внутренняя реализация может измениться в какой-то момент.позвонить утилизировать.Просто сделай это:)

2 голосов
/ 30 августа 2010

Многие считают, что лучше закрывать IDisposable объекты, потому что это делает код более понятным. Однако явный вызов Dispose выполняется автоматически, если вы инкапсулируете использование IDisposable в операторе using, как описывает эта страница .

0 голосов
/ 30 августа 2010

Вы правы.Документация не ясна, поскольку в методе dispose написано, что вы должны вызывать Dispose () для очистки неуправляемых ресурсов сокета, но с другой стороны Close должен делать то же самое.Я предполагаю, что Close вызывает Dispose или наоборот.Такое же поведение поддерживается файлами, поэтому это обоснованное предположение.

0 голосов
/ 30 августа 2010

Позвольте .NET вызывать dispose:

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