2013-09-17 2 views
0

Мой код шифрованияАнализ кода, показывающий Не бросайте объекты несколько раз

{ 
    AesManaged aes = null; 
    MemoryStream memoryStream = null; 
    CryptoStream cryptoStream = null; 

    try 
    { 
     Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password, Encoding.UTF8.GetBytes(salt), 10000); 

     aes = new AesManaged(); 
     aes.Key = rfc2898.GetBytes(32); 
     aes.IV = rfc2898.GetBytes(16); 

     memoryStream = new MemoryStream(); 
     cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write); 

     byte[] data = Encoding.UTF8.GetBytes(dataToEncrypt); 
     cryptoStream.Write(data, 0, data.Length); 
     cryptoStream.FlushFinalBlock(); 

     return Convert.ToBase64String(memoryStream.ToArray()); 
    } 
    finally 
    { 
     if (cryptoStream != null) 
      cryptoStream.Close(); 

     if (memoryStream != null) 
      memoryStream.Close(); 

     if (aes != null) 
      aes.Clear(); 
    } 
} 

Я просто попытался анализ кода его давая мне

CA2202 
Do not dispose objects multiple times 
Object 'memoryStream' can be disposed more than once in method 'EncryptDecrypt.Encrypt(string, string, string)'. 
To avoid generating a System.ObjectDisposedException you should not call Dispose more than one time on an object. 

Но мой код работает отлично, я создал MemoryStream & CryptoStream & закрыл их после ... но я не могу понять, почему это говорит мне несколько объектов несколько раз

+1

Вы должны использовать инструкцию 'using'. (хотя это не решит эту проблему) – SLaks

ответ

1

Рекомендации для IDisposable утверждают, что удаление одного и того же объекта дважды не должно иметь эффекта во второй раз.

Однако не все реализации следуют этому руководству, поэтому Code Analysis говорит вам не полагаться на него.

Ваши конкретные объекты в этом отношении безопасны, поэтому у вас нет реальной проблемы.

Смежные вопросы