Подтвердить что ты не робот

Должен ли я вручную утилизировать сокет после его закрытия?

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

Например:

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

Никогда не помешает вызвать Dispose. Просто сделайте это:)

Ответ 4

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

Ответ 5

Пусть .NET invoke dispose:

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

Ответ 6

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