Не удается избавиться от предупреждения CA2202

Я прочитал страницу MSDN по этому адресу: https://msdn.microsoft.com/en-us/library/ms182334.aspx

А также этот так ответ: /questions/37194493/utiliziruet-li-streamreader-potok/37194517#37194517

Но следующий код все еще генерирует 2 предупреждения CA2202 для меня:

FileStream fileStream = null;
BufferedStream bufferedStream = null;
try
{
    fileStream = File.Open(...);
    bufferedStream = new BufferedStream(fileStream);

    using (StreamReader streamReader = new StreamReader(bufferedStream))
    {
        ...
    }
}
finally
{
    if (bufferedStream != null)
    {
        bufferedStream.Dispose();
    }

    if (fileStream != null)
    {
        fileStream.Dispose();
    }
}

Строка "bufferedStream.Dispose()" по-прежнему выдает два следующих предупреждения:

Код серьезности Описание Состояние подавления строки файла проекта Предупреждение CA2202 Объект "bufferedStream" может быть размещен более одного раза в методе "Loader.UpdateIndex()". Чтобы избежать создания исключения System.ObjectDisposedException, не следует вызывать метод Dispose для объекта более одного раза.: Строки: 930 Loader C:\Users\user\Loader\Loader.cs 930 Active

а также

Код серьезности Описание Состояние подавления строки файла проекта Предупреждение CA2202 Объект 'fileStream' может быть расположен более одного раза в методе 'Loader.UpdateIndex()'. Чтобы избежать создания исключения System.ObjectDisposedException, не следует вызывать метод Dispose для объекта более одного раза.: строки: 930, 935 Loader C:\Users\user\Loader\Loader.cs 930 Active

Предположительно, это связано с тем, что fileStream можно было утилизировать более одного раза? Но как можно избавиться от bufferedStream более одного раза?

Изменить: я пометил ответ @Damien_The_Unbeliever как правильный. Вы также можете урезать его, потому что, как упоминалось где-то ниже, вам не нужна переменная bufferedReader. Вот чем я закончил. Это некрасиво, но работает

FileStream fileStream = null;
try
{
    fileStream = File.Open("iaushdiuh", FileMode.Open);

    fileStream = null;

    using (StreamReader streamReader = new StreamReader(fileStream))
    {
        streamReader.ReadLine();
    }
}
finally
{
    if (fileStream != null)
    {
        fileStream.Dispose();
    }
}

1 ответ

Решение

Если вы не используете базовые потоки после того, как "передали владение" этими объектами другим объектам, вы можете отключить предупреждение следующим образом:

        FileStream fileStream = null;
        BufferedStream bufferedStream = null;
        try
        {
            fileStream = File.Open(...);
            bufferedStream = new BufferedStream(fileStream);

            fileStream = null;

            using (StreamReader streamReader = new StreamReader(bufferedStream))
            {

                bufferedStream = null;

                ...
            }
        }
        finally
        {
            if (bufferedStream != null)
            {
                bufferedStream.Dispose();
            }

            if (fileStream != null)
            {
                fileStream.Dispose();
            }
        }

Вы хотите, чтобы задания null происходить сразу после вызова конструктора, который "становится владельцем" одноразового объекта. Таким образом, вы гарантируете, что если конструктор сгенерирует, вы удалите внутренний объект, и если конструктор преуспеет, тогда он будет организовывать удаление.

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