Как уже было сказано, объекты, которые реализуют IDisposable, не получают сборщик мусора немедленно. Если вы не вызываете Dispose для одноразового объекта, явным образом или путем его использования, то для сбора мусора этому объекту потребуется больше времени.
Если вы используете попытку, вы должны рассмотреть возможность объявления таких переменных вне попытки и реализовать удаление в блоке finally. Особенно с AesCryptoServiceProvider, где вы хотите убедиться, что метод Clear () выполняется даже при возникновении ошибки, так как использование не сделает этого за вас.
public static string Decrypt(string cipherText)
{
string decryptedMessage = null;
AesCryptoServiceProvider Aes = null;
ICryptoTransform cTransform = null;
try
{
//Decrypt:
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
byte[] toDecryptArray = Convert.FromBase64String(cipherText);
AesCryptoServiceProvider Aes = new AesCryptoServiceProvider();
Aes.Key = keyArray;
Aes.Mode = CipherMode.CBC;
Aes.Padding = PaddingMode.PKCS7;
Aes.IV = IV;
ICryptoTransform cTransform = Aes.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toDecryptArray, 0, toDecryptArray.Length);
decryptedMessage = UTF8Encoding.UTF8.GetString(resultArray, 0, resultArray.Length);
}
catch (Exception ex)
{
decryptedMessage = "FAILED:*" + cipherText + "*" + ex.Message;
}
finally
{
if (cTransform != null)
{
cTransform.Dispose();
}
if (Aes != null)
{
Aes.Clear();
Aes.Dispose();
}
}
return decryptedMessage;
}
Вам также следует подумать о том, чтобы выбросить исключение, исключив блок catch и сохранив finally, и обработав его вне этого метода.
Вы также можете вернуть bool для успеха / неудачи и передать расшифрованную строку, используя out. Таким образом, вы не путаете ваши ошибки с содержанием вашего сообщения:
public bool string Decrypt(string cipherText, out string decryptedMessage)
{
bool succeeded = false;
decryptedMessage = null;
AesCryptoServiceProvider Aes = null;
ICryptoTransform cTransform = null;
try
{
//Decrypt:
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
byte[] toDecryptArray = Convert.FromBase64String(cipherText);
AesCryptoServiceProvider Aes = new AesCryptoServiceProvider();
Aes.Key = keyArray;
Aes.Mode = CipherMode.CBC;
Aes.Padding = PaddingMode.PKCS7;
Aes.IV = IV;
ICryptoTransform cTransform = Aes.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toDecryptArray, 0, toDecryptArray.Length);
decryptedMessage = UTF8Encoding.UTF8.GetString(resultArray, 0, resultArray.Length);
succeeded = true;
}
catch (Exception ex)
{
decryptedMessage = "FAILED:*" + cipherText + "*" + ex.Message;
}
finally
{
if (cTransform != null)
{
cTransForm.Dispose();
}
if (Aes != null)
{
Aes.Clear();
Aes.Dispose();
}
}
return succeeded;
}