Когда избавляться и почему? - PullRequest
10 голосов
/ 21 октября 2010

Я задал вопрос об этом методе:

// Save an object out to the disk
public static void SerializeObject<T>(this T toSerialize, String filename)
{
    XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
    TextWriter textWriter = new StreamWriter(filename);

    xmlSerializer.Serialize(textWriter, toSerialize);
    textWriter.Close();
}

в ответ я получил это как дополнительное замечание:

Убедитесь, что вы всегдараспоряжаться одноразовыми ресурсами, такими как потоковые и текстовые читатели и писатели.Похоже, что это не так в вашем методе SerializeObject.

Итак, я могу сказать, что это покажется супер хромым для человека, который кодирует C # в течение года или двух, нопочему я должен его утилизировать?

Видит ли, что testWriter имеет метод dispose, но разве сборщик мусора не должен об этом заботиться?Я пришел из Delphi в C #.В Delphi мне пришлось все вычистить, поэтому я не хочу быть ленивым.Мне просто сказали, что если вы заставите освободить память, которую занимают ваши объекты, это может привести к плохим вещам.Мне сказали: «Просто позвольте сборщику мусора сделать это».

  1. Итак, зачем мне вызывать dispose?(Я предполагаю, что это потому, что textWriter попадает на диск.)
  2. Есть ли список объектов, с которыми мне нужно быть осторожнее?(Или простой способ узнать, когда мне нужно позвонить утилизировать?)

Ответы [ 12 ]

0 голосов
/ 21 октября 2010

Причина вызова Dispose, а не ожидания GC, часто заключается в том, что вы используете ограниченный системный ресурс, который вы хотите высвободить как можно быстрее, чтобы другие процессы или потоки могли использовать его.Для объектов, имеющих шаблон IDisposable, конструкция «using» - это простой и читаемый способ убедиться, что Dispose вызывается.

0 голосов
/ 21 октября 2010

Сборщик мусора действительно «позаботится об этом». Рано или поздно. Когда доходит до вызова финализатора, после следующей сборки мусора.

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

...