2016-11-21 55 views
0

我不能讓周圍的決議,這些代碼分析警告我的頭。CA2202代碼曲線變化分析問題與處置

這是代碼:

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();電話。我可以看到我的代碼中有兩次這樣的調用。

錯誤:

Errors

+1

你的身體內設置它'的'finally' try'以及 - 只要拿出一個在'try' – stuartd

+1

只是刪除i_Crypt。關閉()從try塊,作爲最後總是被執行。 –

+1

雖然配置對象不止一次就是應該被淘汰不好的代碼的氣味,該警告是有點誤導。其拋出的ObjectDisposedException上的第二處置的對象有一個錯誤; MSDN文檔說Dispose必須是冪等的。 –

回答

3

只需取下關閉();從你的嘗試塊。

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

實際上它調用了由IDisposable定義的Dispose()方法,而不是Close()。我不確定Close()是否正在執行一些Dispose未做的額外清理工作,但使用using塊並在對象上調用.Close()可能會有所不同。 –