Следующий код является упрощенным выпиской из части нашего производственного кода. Он вычисляет SHA256 хэш файла и возвращает его в виде строки, или возвращает null
, если файл не доступен:Исключительный фильтр вызывает CA2000, несмотря на использование оператора
private static string CalculateHash(string fileName)
{
try
{
string result;
using (SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider())
{
byte[] data = File.ReadAllBytes(fileName);
result = BitConverter.ToString(sha256.ComputeHash(data));
}
Debug.WriteLine("Calculated hash for '" + fileName + "': " + result, 3);
return result;
}
catch (UnauthorizedAccessException ex)
{
Debug.WriteLine("The hash calculation failed: " + ex.Message, 3);
return null;
}
catch (IOException ex)
{
Debug.WriteLine("The hash calculation failed: " + ex.Message, 3);
return null;
}
}
Один из наших разработчиков недавно переработан код, используя фильтр исключений для уменьшения дубликатов catch
блоков , так что теперь выглядит следующим образом:
private static string CalculateHash(string fileName)
{
try
{
string result;
using (SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider())
{
byte[] data = File.ReadAllBytes(fileName);
result = BitConverter.ToString(sha256.ComputeHash(data));
}
Debug.WriteLine("Calculated hash for '" + fileName + "': " + result, 3);
return result;
}
catch (Exception ex) when (ex is UnauthorizedAccessException || ex is IOException)
{
Debug.WriteLine("The hash calculation failed: " + ex.Message, 3);
return null;
}
}
Однако теперь мы получаем предупреждение анализа кода:
CA2000 - в методе 'CalculateHash (строка)', вызовите System.IDisposable. Утилизируйте объект «sha256» до того, как все ссылки на него выходят за рамки.
Как я вижу, здесьнаходится здесь правильно, и это произойдет, если исключение поймает фильтр или нет.
Является ли этот CA2000 ложным положительным или имеет фильтр исключений, созданный сценарий, в котором удаление не произойдет?
Я также получаю 'CA2202' с' when' в вашем примере (комментируя это устранит все предупреждения). Кажется, проблема с анализом кода. 'finally' (из [' using'] (https://msdn.microsoft.com/en-us/library/yh598w02.aspx)) гарантированно будет выполняться перед любым ** внешним ** 'catch'. – Sinatr