Как исправить Объект 'oFs' может быть размещен в методе более одного раза

Код

public static void StrToFile(string value, string cFileName)
{
    if (File.Exists(cFileName) == true)
    {
        File.Delete(cFileName);
    }

    FileStream oFs = new FileStream(cFileName, FileMode.CreateNew, FileAccess.ReadWrite);
    StreamWriter oWriter = new StreamWriter(oFs);
    oWriter.Write(value);
    oWriter.Flush();
    oWriter.Close();
    oFs.Close();
}

причины в Visual Studio Community Edition code Анализ ошибки в строке oFs.Close();

Warning CA2202  Object 'oFs' can be disposed more than once in method 'Core.StrToFile(string, string)'. To avoid generating a System.ObjectDisposedException you should not call Dispose more than one time on  an object.

Как это исправить?

1 ответ

Решение

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

Попробуйте использовать using вместо этого посмотрите, работает ли это:

using (FileStream oFs = new FileStream(cFileName, FileMode.CreateNew, FileAccess.ReadWrite))
using (StreamWriter oWriter = new StreamWriter(oFs))
{
    oWriter.Write(value);
    // oWriter.Flush();
}

Если это не сработает, вам, возможно, придется переписать свой код так:

using (var oWriter = new StreamWriter(new FileStream(...)))
{
    oWriter.Write(value);
    // oWriter.Flush();
}

то есть. передать поток автору, но не хранить ссылку на него. Лично мне не нравится этот вариант, так как если есть проблема внутри конструктора StreamWriterЯ не уверен FileStream объект правильно утилизируется.

Другие вопросы по тегам