Предупреждения CA2000 и CA2202 в последнее время были проклятием моего существования. Что я здесь делаю неправильно? Я в основном получаю FileStream
с использованием File.Open
, а затем передаю его функции, которая может возвращать новый поток или может возвращать тот же поток. Затем я выполняю еще несколько действий в своем потоке, а затем в своем блоке finally
я распоряжаюсь потоком, который я использовал, если он был другим.CA2000/CA2202 для потока в операторе using
Я получаю два предупреждения CA. 2000 для fileStream
в блоке using
и 2202 для changedStream
в блоке finally
. Что дает?
using (Stream fileStream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
Stream changedStream = null;
try
{
changedStream = someCondition ? fileStream : DoSomeActionThatMayReturnNewStream(fileStream);
DoSomeMoreStuffWithStream(changedStream);
}
finally
{
if (changedStream != null && changedStream != fileStream)
{
changedStream.Dispose();
}
}
}
Это было бы идеально, если бы я имел контроль над API 'DoSomeActionThatMayReturnNewStream'. Он действительно работает и вызывает «Stream.Close» в любое время, когда ему нужно создать новый поток. Но поскольку он не является параметром ref, нет способа сообщить вызывающему, что он это сделал. – sohum
Кроме того, FxCop автоматически предполагает, что всякий раз, когда мы передаем поток в качестве параметра функции, которую он будет располагать/не удалять или он действительно анализирует функцию, в которую мы ее передаем? – sohum
@sohum: По моему пониманию, FxCop знает, что несколько методов берут на себя ответственность за переданный параметр, но не могут вообще выводить такие вещи. Если бы вы контролировали API, использование параметра 'ref' позволило бы FxCop быть агностиком в отношении права собственности на объект. В противном случае, самое лучшее, что можно сделать, вероятно, использовать одну и ту же переменную для исходного и нового, и указать, что если вызов удастся, код будет нести ответственность за удаление объекта в переменной независимо от того, является ли он исходным или новый. Один из них не сможет использовать 'использование', но ... – supercat