Нужно ли распоряжаться возвращенными объектами, которые я не использую? - PullRequest
4 голосов
/ 03 мая 2011

У меня есть следующий код:

WebRequest request = WebRequest.Create("ftp://myServer/myDirectory");
request.Method = WebRequestMethods.Ftp.MakeDirectory;
request.Credentials = new NetworkCredential("userName", "password");

request.GetResponse();

Нужно ли избавляться от объекта WebResponse, который возвращается WebRequest?

Ответы [ 3 ]

10 голосов
/ 03 мая 2011

Вы должны. Оберните его в оператор using, и он будет автоматически удален при выходе из области действия

using (var response = request.GetResponse())
{

}
4 голосов
/ 03 мая 2011

Что касается необходимости распоряжаться, я бы сказал, нет. Когда CLR обнаруживает, что нет ссылок на объект, объект будет запланирован для сборки мусора. Проблема, с которой вы можете столкнуться, состоит в том, что нет никаких гарантий, что объект и его атрибуты будут очищены в правильном порядке. Простые объекты / классы, будь то часть .NET Framework или пользовательские объекты / классы, редко реализуют интерфейс iDisposable. Если объект / класс реализует iDisposable, вам определенно следует вызвать метод dispose, чтобы обеспечить правильную обработку очистки, поскольку у разработчика было некоторое указание на то, что необходимо выполнить очистку определенным образом. Как заявил Stecya, оборачивание в блок using - отличный способ убедиться, что это делается автоматически. Вы также можете использовать блок try / finally, чтобы добиться того же (избавиться от объекта в блоке finally).

3 голосов
/ 03 мая 2011

Да, вы должны. И вы правы в том, что это не совсем очевидно, обычно вам следует только удалять созданные вами объекты (с new) и оставлять те, которые вы получаете / заимствуете из другого компонента, в одиночку.

Ключ находится в имени и описании WebRequest.Create(), это фабричный метод, который создает что-то от вашего имени, и вызывающая сторона (вы) отвечает за возвращаемое значение.

И, конечно, предпочтительный синтаксис - это блок using() {}.

...