2016-11-21 4 views
0

私はこれらの解決のまわりで私の頭を得ることができませんコード分析警告。CA2202 DisposeでのCode Anaysisの問題

これはコードである:

public static string Crypt(string s_Data, string s_Password, bool b_Encrypt) 
    { 
     byte[] u8_Salt = new byte[] { ... }; 

     PasswordDeriveBytes i_Pass = new PasswordDeriveBytes(s_Password, u8_Salt); 

     Rijndael i_Alg = Rijndael.Create(); 
     i_Alg.Key = i_Pass.GetBytes(32); 
     i_Alg.IV = i_Pass.GetBytes(16); 

     ICryptoTransform i_Trans = (b_Encrypt) ? i_Alg.CreateEncryptor() : i_Alg.CreateDecryptor(); 

     MemoryStream i_Mem = new MemoryStream(); 
     CryptoStream i_Crypt = new CryptoStream(i_Mem, i_Trans, CryptoStreamMode.Write); 

     byte[] u8_Data; 
     if (b_Encrypt) 
      u8_Data = Encoding.Unicode.GetBytes(s_Data); 
     else 
      u8_Data = Convert.FromBase64String(s_Data); 

     try 
     { 
      i_Crypt.Write(u8_Data, 0, u8_Data.Length); 
      i_Crypt.Close(); 
      if (b_Encrypt) 
       return Convert.ToBase64String(i_Mem.ToArray()); 
      else 
       return Encoding.Unicode.GetString(i_Mem.ToArray()); 
     } 
     catch 
     { 
      return null; 
     } 
     finally 
     { 
      i_Crypt.Close(); 
     } 
    } 

エラーがi_Crypt.Close(上に上昇しています)。呼び出し。私は自分のコードでその呼び出しが2回あることがわかります。

エラー:

Errors

+1

あなたは 'try'の本体内にそれを配置するだけでなく、' finally'でいる - だけだけi_Cryptを削除 'try' – stuartd

+1

に1を取ります。最終的に常に実行されているように、tryブロックからClose()を実行します。 –

+1

オブジェクトを2回以上処分するのは悪いコードの臭いですが、警告はいくらか誤っています。 2番目のdisposeにObjectDisposedExceptionをスローするオブジェクトにはバグがあります。 MSDNのドキュメントによると、Disposeは冪等でなければならないという。 –

答えて

3

は単にクローズを削除();あなたのtryブロックから。さらに良い

try 
{ 
    i_Crypt.Write(u8_Data, 0, u8_Data.Length); 
    if (b_Encrypt) 
     return Convert.ToBase64String(i_Mem.ToArray()); 
    else 
     return Encoding.Unicode.GetString(i_Mem.ToArray()); 
} 
catch 
{ 
    return null; 
} 
finally 
{ 
    i_Crypt.Close(); 
} 

あなたが少しをしようとした場合、あなたはおそらく使用してブロックであなたのMemoryStreamとCryptoStreamを使用することができます。

Should I call Close() or Dispose() for stream objects?

Using block vs IDisposabe.Dispose()

+0

それで、 'using'コードブロックが自動的に' close() '呼び出しを呼び出すと言っていますか?それで私は明らかです。ありがとう。 –

+2

実際には、Close()ではなくIDisposableで定義されたDispose()メソッドを呼び出しています。私は、Close()がDisposeが行っていない追加のクリーンアップを行っているのかどうかは不明ですが、usingブロックを使用してオブジェクトの.Close()を呼び出すのに違いがあります。 –

関連する問題