我有一个使用 SELECT...CASE 语句根据用户输入创建对象的过程:
Dim hash As HashAlgorithm
' Make sure hashing algorithm name is specified.
If (hashAlgorithm Is Nothing) Then
hashAlgorithm = ""
End If
' Initialize appropriate hashing algorithm class.
Select Case hashAlgorithm.ToUpper()
Case "SHA1"
hash = New SHA1Managed()
Case "SHA256"
hash = New SHA256Managed()
Case "SHA384"
hash = New SHA384Managed()
Case "SHA512"
hash = New SHA512Managed()
Case Else
hash = New MD5CryptoServiceProvider()
End Select
VS Analyzer 抱怨我没有在 SELECT...CASE 的每个实例中处理对象。因此,如果用户提供“SHA1”作为算法类型,则哈希将设置为新SHA1Managed
对象。为什么我需要处置SHA256Managed
从未创建的 New 类?
但是......如果我只是在过程结束时处理散列对象:
hash.dispose()
分析器抱怨我没有处理SHA1Managed
, SHA256Managed
, SHA384Managed
,SHA512Managed
和MD5CryptoServiceProvider
对象...其中 4 个无论如何都没有创建...
我不能使用Using hash as HashAlgorithm
,因为必须在Using
语句中实例化对象。
我在想也许代码分析器只是针对New <Object>
语句,我很酷,但我想来这里征求一些意见......
编辑: 好的显然还不清楚,所以这里有一个非常简单、小、完整的程序可以使用:
Public Shared Function HashMe(ByVal plainText As String, ByVal hash2use As String) As Byte()
Dim myHash As HashAlgorithm
Select Case hash2use.ToUpper
Case "SHA1"
myHash = New SHA1Managed()
Case "SHA256"
myHash = New SHA256Managed()
Case "SHA384"
myHash = New SHA384Managed()
Case "SHA512"
myHash = New SHA512Managed()
Case Else
myHash = New MD5CryptoServiceProvider()
End Select
Return myHash.ComputeHash(Encoding.UTF8.GetBytes(plainText))
myHash.Dispose()
End Function
这个过程可以正常工作,除了 VS Analyzer 希望我New <Object>
在SELECT CASE
将其包装在 Using 块中的答案是无效的,并且不会编译。