Asp.net CA2000:对象未沿所有异常路径释放
我在试图找出为什么我在下面的代码中得到这个警告时遇到了困难 CA2000:Microsoft。可靠性:在方法“Encryption64.Decrypt(String,String)”中,对象“des”未沿所有异常路径释放。在对象“des”的所有引用都超出范围之前,对其调用System.IDisposable.Dispose CA2000:Microsoft。可靠性:在方法“Encryption64.Encrypt(String,String)”中,对象“des”不会沿所有异常路径释放。在对象“des”的所有引用都超出范围之前,对其调用System.IDisposable.DisposeAsp.net CA2000:对象未沿所有异常路径释放,asp.net,vb.net,code-analysis,idisposable,Asp.net,Vb.net,Code Analysis,Idisposable,我在试图找出为什么我在下面的代码中得到这个警告时遇到了困难 CA2000:Microsoft。可靠性:在方法“Encryption64.Decrypt(String,String)”中,对象“des”未沿所有异常路径释放。在对象“des”的所有引用都超出范围之前,对其调用System.IDisposable.Dispose CA2000:Microsoft。可靠性:在方法“Encryption64.Encrypt(String,String)”中,对象“des”不会沿所有异常路径释放。在对象“d
只是一个猜测,但也许它还不够聪明,无法意识到这一代码行永远是正确的:
If des IsNot Nothing Then
换句话说,它可能假设由于存在条件语句,Dispose()
调用可能不会执行
要检查,您可以尝试注释掉“if”并查看警告是否消失。因为您正在try之外声明(并实例化)des对象。。。最后,您的代码可能会在Dim ms行中引发异常,因为New MemoryStream()和您的.Dispose()将不会被调用
当您使用实现IDisposable的对象时,最好尽可能将它们包装在Using块中,而不是Try…Finally块中。例如:
公共函数解密(ByVal stringToDecrypt As String,ByVal sEncryptionKey As String)为String
Dim ms As New MemoryStream()
Dim ReturnValue As String = String.Empty
Dim inputByteArray(stringToDecrypt.Length) As Byte
key = System.Text.Encoding.UTF8.GetBytes(Left(sEncryptionKey, 8))
inputByteArray = Convert.FromBase64String(stringToDecrypt)
Using ms as New MemoryStream
Using des As New DESCryptoServiceProvider
Dim cs As New CryptoStream(ms, des.CreateDecryptor(key, IV),CryptoStreamMode.Write)
cs.Write(inputByteArray, 0, inputByteArray.Length)
cs.FlushFinalBlock()
End Using ' des
Dim encoding As System.Text.Encoding = System.Text.Encoding.UTF8
ReturnValue = encoding.GetString(ms.ToArray())
End Using ' ms
Catch e As Exception
ReturnValue = e.Message
End Try
Return ReturnValue
End Function
不太好,没用。我还怀疑“Dim cs As New CryptoStream…”行可能会抛出一个异常,在这种情况下des不会被处置。所以我试着再做一次尝试…抓住…最后,对于那些台词,它仍然给出了相同的警告。谢谢,这没有任何问题!只是出于好奇,使用是否为我们自动处理?我写.Net代码已经有相当一段时间了,但从来没有真正关心过代码分析/优化。是的。在VB8(2003)中引入了Using,并为您处理对包装对象的Dispose调用。
Dim ms As New MemoryStream()
Dim ReturnValue As String = String.Empty
Dim inputByteArray(stringToDecrypt.Length) As Byte
key = System.Text.Encoding.UTF8.GetBytes(Left(sEncryptionKey, 8))
inputByteArray = Convert.FromBase64String(stringToDecrypt)
Using ms as New MemoryStream
Using des As New DESCryptoServiceProvider
Dim cs As New CryptoStream(ms, des.CreateDecryptor(key, IV),CryptoStreamMode.Write)
cs.Write(inputByteArray, 0, inputByteArray.Length)
cs.FlushFinalBlock()
End Using ' des
Dim encoding As System.Text.Encoding = System.Text.Encoding.UTF8
ReturnValue = encoding.GetString(ms.ToArray())
End Using ' ms
Catch e As Exception
ReturnValue = e.Message
End Try
Return ReturnValue
End Function