Должен ли я вручную утилизировать сокет после его закрытия?
Должен ли я по-прежнему вызывать Dispose()
в моем сокете после его закрытия?
Например:
mySocket.Shutdown(SocketShutdown.Both);
mySocket.Close();
mySocket.Dispose(); // Redundant?
Мне было интересно, потому что документация MSDN говорит следующее:
Закрывает соединение Socket и освобождает все связанные ресурсы.
Ответы
Ответ 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 или наоборот. Такое же поведение поддерживается файлами, поэтому это обоснованное предположение.