Как правильно распоряжаться объектом?Почему анализ кода постоянно меняет свое мнение? - PullRequest
2 голосов
/ 31 июля 2011

Я присоединился к проекту вчера, мы решили объединить наши два проекта в один, и объединить функции обоих (они в основном нас поглотили).

Проблема в том, что у них где-то есть утечка памяти, имне поручили найти и убить его.

Я запустил анализ кода в Visual Studio и предложил длинный список предупреждений, большинство из которых мы можем игнорировать, а те, которые я пытаюсь исправить, - это проблемы.с удалением объекта.Что-то, на что я никогда не обращал особого внимания, и я удивлен, обнаружив, что получить анализ кода, чтобы решить, что что-то правильно, нелегко.

Код Начался так:

StreamWriter SW = new StreamWriter(File.Create("folder/file.txt"));
SW.WriteLine("text");
SW.WriteLine("text");
SW.WriteLine("text");
SW.WriteLine();
SW.WriteLine("text");
SW.WriteLine("text");
SW.WriteLine("text");
SW.Close();
SW.Flush();

Но Code Analysis сказал, что File.Create не удалялся по всем путям кода и что SW можно было утилизировать не раз, я пошел посмотреть и обнаружил, что вы не должны использовать и Close и Flush, и вНа самом деле, вы должны использовать оператор using, поэтому я изменил его на следующее:

using(StreamWriter SW = new StreamWriter(File.Create("folder/file.txt")))
{
    SW.WriteLine("text");
    SW.WriteLine("text");
    SW.WriteLine("text");
    SW.WriteLine();
    SW.WriteLine("text");
    SW.WriteLine("text");
    SW.WriteLine("text");
}

Утилизируемый SW ушел, но он по-прежнему говорил, что File.Create не удалялся по всем путям кода, есть только один путь к коду, поэтому это не имело смысла, я попытался добавить отдельный оператор Using для File.Create и создать / записать файл отдельно, но анализ кода все равно его улавливает.

ЭтоПохоже, что-то, что было бы легко понять, если бы у VS не было ложного срабатывания или чего-то в этом роде.

В любом случае, спасибо, что дали мне время для чтенияthis.

~ EDIT

Я соврал в оригинальном посте, когда я добавляю оператор double using, в том числе когда я использую «Stream», он говорит мне, что объект может быть удален более одного раза, вызывая исключение объекта.Я предполагаю, что это было бы странно.так как я сам никогда не избавляюсь от него.

текущий код:

using (Stream stream = File.Create("folder/file.txt"))
{
    using (StreamWriter SW = new StreamWriter(stream))
    {
        SW.WriteLine("");
        SW.WriteLine("");
        SW.WriteLine("");
        SW.WriteLine();
        SW.WriteLine("");
        SW.WriteLine("");
        SW.WriteLine("");
    }
}

Этот сработал И ПРОТИВ его прошли, большое спасибо.

using (StreamWriter SW = File.CreateText("text/awardsList.txt"))
{
    SW.WriteLine("");
    SW.WriteLine("");
    SW.WriteLine("");
    SW.WriteLine();
}

1 Ответ

4 голосов
/ 31 июля 2011

Я подозреваю, что он ищет что-то вроде этого:

using (Stream stream = File.Create("folder/file.txt"))
{
    using (StreamWriter writer = new StreamWriter(stream))
    {
        ...
    }
}

Вероятно, разумно предположить, что если File.Create удастся, то так же будет и конструктор StreamWriter - но возможно, что VS незнать это.Он также может не знать, что удаление записи удаляет поток.

Лично я бы вместо этого использовал File.CreateText, что позволяет избежать проблемы и проще:)

using (TextWriter writer = File.CreateText("folder/file.txt"))
{
    ...
}
...