Где закрыть член TcpClient - PullRequest
       20

Где закрыть член TcpClient

0 голосов
/ 28 марта 2012

Контекст: У меня есть класс, который реализует «Сеанс», поддерживающий TCP-соединение с сервером в течение его срока службы. В конструкторе я создаю экземпляр TcpClient с заданным IP-адресом и портом сервера для подключения.

   public Session(IPAddress ipAddress)
   {
       Client = new TcpClient(ipAddress.ToString(), 1234); //create a client to a server which we will later use to work with
       DataStream = Client.GetStream(); //get the stream for later usage
   }

Объекты этого сеанса время от времени будут отправлять и получать данные на связанный сервер и с них.

Мой вопрос сейчас такой: Где мне закрыть TcpClient и лежащий в его основе NetworkStream?

Должен ли я реализовать IDisposable? Но что произойдет, если пользователь моего класса забудет вызвать Dispose?

Должен ли я реализовать Destructor (он же Finalizer)? Но AFAIK Я никогда не получу доступ к управляемым ресурсам оттуда?

Спасибо за помощь!

Ответы [ 3 ]

2 голосов
/ 28 марта 2012

Должен ли я реализовать IDisposable?

Да

Но что произойдет, если пользователь моего класса забудет вызвать Dispose?

Вы должны следовать шаблону Disposable, как определеноздесь: http://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx

1 голос
/ 28 марта 2012

См. Множество тем на тему " Когда я должен выполнить Implment IDisposable? "

Триггер для вас, поскольку у вас есть поле (Client), которое реализует IDisposable. Таким образом, ваш класс должен быть одноразовым.

0 голосов
/ 30 марта 2012

Очень немногие классы должны иметь финализаторы очистки.Если код, отвечающий за управление экземпляром IDisposable, игнорирует вызов IDisposable.Dispose перед тем, как отказаться от него, код следует исправить.Добавление финализатора может замаскировать проблему, но не решит ее, и, скорее всего, представит Heisenbugs ™.Кроме того, если класс отвечает за вещи, которые реализуют IDisposable и имеют финализаторы, класс должен будет гарантировать, что метод Dispose этих вещей будет вызван (вероятно из его собственного Dispose метода), но не будет нести ответственностьдля вызова финализаторов этих вещей из своего собственного.Действительно, когда работает финализатор класса, одна из следующих трех вещей обычно будет верна для любых финализируемых объектов, на которые он ссылается:

  1. Он уже будет завершен.
  2. Он уже будет в очереди на финализацию вскоре после завершения работы настоящего финализатора.
  3. Живая ссылка на него будет существовать где-то еще, и его пока не нужно очищать.

В любом из этих случаев для финализатора правильное отношение к объекту - "ничего".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...