Der folgende Code ist ein vereinfachter Auszug aus einem Teil unseres Produktionscodes. Es berechnet die SHA256-Hash für eine Datei und gibt ihn als String oder zurückgibt null
wenn die Datei nicht zugegriffen werden kann:Ausnahmefilter verursacht CA2000 trotz einer using-Anweisung
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;
}
}
Einer unserer Entwickler Refactoring vor kurzem den Code mit einer Ausnahme Filter die doppelten catch
Blöcke zu reduzieren es sieht aus, so dass nun wie folgt aus:
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;
}
}
aber wir nun eine Code-Analyse-Warnung erhalten:
CA2000 - In Verfahren 'CalculateHash (string)', System.IDisposable nennen. Entsorgen Sie das Objekt 'sha256', bevor alle Verweise darauf außerhalb des Bereichs liegen.
Soweit ich sehen kann, ist die SHA256CryptoServiceProvider
richtig hier angeordnet ist, und das wird passieren, ob die Ausnahme durch die Filter aufgefangen wird oder nicht.
Ist diese CA2000 falsch positiv oder hat der Ausnahmefilter ein Szenario erstellt, in dem die Entsorgung nicht stattfindet?
Ich bekomme auch 'CA2202' mit' wenn' in Ihrem Beispiel (kommentieren wird es alle Warnungen beseitigen). Scheint wie Code-Analyse-Problem. 'finally' (von [' using'] (https://msdn.microsoft.com/en-us/library/yh598w02.aspx)) wird garantiert vor jedem ** äußeren ** 'catch' laufen. – Sinatr