Использование и сборка "мусора"

Выяснилось, что вы на правильном пути, но мне пришлось установить свойства UserAgent и Refer в HttPWebRequest. Я думаю, Facebook хочет убедиться, что вы не бот

      public static T Get<T>(string uri)
       {
           HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            request.UserAgent = "Mozilla / 5.0(Windows; U; WindowsNT 5.1; en - US; rv1.8.1.6) Gecko / 20070725 Firefox / 2.0.0.6";
            request.Referer = "http://www.google.com";
           request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

           using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
           using (Stream stream = response.GetResponseStream())
           using (StreamReader reader = new StreamReader(stream))
           {
               string json = reader.ReadToEnd();
               Object result = new JavaScriptSerializer().Deserialize<T>(json);
               return (T)result;
           }
       }
   }
5
задан Paulo Guedes 17 March 2009 в 20:31
поделиться

4 ответа

Никакой объект не будет уничтожен в конце блока.

Object1 будет Расположен, другое понятие; ничего не произойдет с Object2.

Оба объекта будут собраны и могут быть завершены, когда-то позже. Сборка "мусора" недетерминирована - Вы не можете полагаться, когда она произойдет.

См. IDisposable на MSDN для больше.

18
ответ дан 18 December 2019 в 07:32
поделиться

Блок использования является действительно синтаксическим сахаром для конструкции как это:

try
{
    Brush b = new SolidBrush(Color.Red);
}
finally
{
    b.Dispose();
}

Так, 'b' будет расположен в конце блока попытки, если чего-то не произойдет, который является вне управления приложения.

2
ответ дан 18 December 2019 в 07:32
поделиться

В конце блока (bookmark1), в Вашем примере, только возражают 1, будет расположен. В случае потока файла это означает, что поток будет закрыт, и дескриптор будет выпущен, но фактический строковый объект все еще будет в памяти (готов быть убранным GC). В Вашем случае не будет расположен Object2, таким образом, дескриптор, который он использует, будет все еще сохранен открытым. В конечном счете GC соберет его и назовет его финализатор, в котором времени это будет выпущено правильно.

Если Вы захотите, чтобы оба объекта были "очищены" правильно, то они оба должны будут быть расположены, или через обертывание их в использовании операторов, или вызов Располагает вручную.

Существует альтернатива, потенциально более чистый синтаксис также:

using (Object1 obj1 = new Object1(), Object2 obj2 = new Object2())
{
    // Do something with obj1 & obj2
}

Если Вы сделаете то это, obj1 И obj2 будет оба Расположено в конце блока. В Вашем случае это означает, что оба объекта будут закрыты, и их выпущенные дескрипторы. GC затем очистит их при некоторой будущей сборке "мусора".

Для получения дополнительной информации посмотрите страницу MSDN на использовании.

1
ответ дан 18 December 2019 в 07:32
поделиться

object2 не будет уничтожен (расположенный) с object1. Однако отдельный блок объема создается для оператора использования, таким образом, object2 действительно выходит из объема в этой точке. Это - распоряжение, просто не детерминировано.

Кроме того, если object2 является также IDisposable, можно сделать это:

using (object1)
using (object2)
{
} // bookmark1

Независимо от того, что, применяют нормальные правила сборки "мусора": управляемые ресурсы (память) для объекта все еще обрабатываются нормальным способом. Using/IDisposable только выпускает неуправляемые ресурсы.

0
ответ дан 18 December 2019 в 07:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: