Не удается избавиться от предупреждения 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
происходить сразу после вызова конструктора, который "становится владельцем" одноразового объекта. Таким образом, вы гарантируете, что если конструктор сгенерирует, вы удалите внутренний объект, и если конструктор преуспеет, тогда он будет организовывать удаление.