NelegalSS
@NelegalSS
Стандартный увлеченный параноик

Предупреждение CA2202 VS2105 и как его исправить?

Доброго дня.
Есть у меня такой вот код.
private static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV)
        {
            // Check arguments.
            if (!String.IsNullOrEmpty(plainText))
                throw new ArgumentNullException("plainText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("IV");

            byte[] encrypted;

            // Create an Aes object
            // with the specified key and IV
            using (Aes aesAlg = Aes.Create())
            {
                aesAlg.Key = Key;
                aesAlg.IV = IV;

                //Create a decrytor to perform the stream transform.
                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

                // Create the streams used for encryption.
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {
                            swEncrypt.Write(plainText);
                        }
                        encrypted = msEncrypt.ToArray();
                    }
                    encrypted = msEncrypt.ToArray();
                }
            }
            // Return the encrypted bytes from the memory stream.
            return encrypted;
        }

При анализе средствами VS2015 Community выдает следующие предупреждения:
Предупреждение CA2202 Объект "'msEncrypt'" можно удалять более одного раза в методе 'CriptToBase.EncryptStringToBytes_Aes(string, byte[], byte[])'. Чтобы избежать исключения System.ObjectDisposedException, следует вызывать метод "Dispose" для объекта только один раз.: Lines: 160, 162

и
Предупреждение CA2202 Объект "'csEncrypt'" можно удалять более одного раза в методе 'CriptToBase.EncryptStringToBytes_Aes(string, byte[], byte[])'. Чтобы избежать исключения System.ObjectDisposedException, следует вызывать метод "Dispose" для объекта только один раз.: Lines: 162


В соответствии с правилами предоставленными справочной системой VS2105 переделал метод как указанно ниже:
private static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV)
        {
            // Check arguments.
            if (!String.IsNullOrEmpty(plainText))
                throw new ArgumentNullException("plainText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("IV");

            byte[] encrypted;

            // Create an Aes object
            // with the specified key and IV.
            Aes aesAlg = null;
            MemoryStream msEncrypt = null;
            CryptoStream csEncrypt = null;
            try            
            {
                aesAlg = Aes.Create();
                aesAlg.Key = Key;
                aesAlg.IV = IV;

                //Create a decrytor to perform the stream transform.
                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

                // Create the streams used for encryption.
                msEncrypt = new MemoryStream();
                {
                    csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {
                            swEncrypt.Write(plainText);
                        }
                        encrypted = msEncrypt.ToArray();
                    }
                    encrypted = msEncrypt.ToArray();
                }
            }
            finally
            {
                if (aesAlg != null)
                    aesAlg.Clear();
                if (msEncrypt != null)
                    msEncrypt.Dispose();
                if (csEncrypt != null)
                    csEncrypt.Dispose();
            }
            // Return the encrypted bytes from the memory stream.
            return encrypted;
        }

и он все так же выдает те же самые предупреждения.
Я понимаю что это не страшно и не критично, но все же как правильно поправить код? Спасибо.
  • Вопрос задан
  • 193 просмотра
Пригласить эксперта
Ответы на вопрос 3
@d-stream
Готовые решения - не подаю, но...
Я бы вообще убрал Dispose, особенно в первом варианте с using.
Это как-то imho более в стиле шарпа.
Ответ написан
lexxpavlov
@lexxpavlov
Программист, преподаватель
Использовать using нормально, для этого его и придумали.

Анализатор показывает предупреждение CA1063? В этом предупреждении он поясняет, что ему не нравится, и предлагает, что сделать. (Это предупреждение возникает в нескольких местах, и текст в них разный.)
Ответ написан
Комментировать
@John_Nash
coder
например, так - запоминать состояния объекта
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы