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 アナライザーは、SELECT...CASE の各インスタンスでオブジェクトを破棄していないと文句を言います。したがって、ユーザーがアルゴリズム タイプとして「SHA1」を指定した場合、ハッシュは新しいSHA1Managed
オブジェクトに設定されます。SHA256Managed
作成されていない New クラスを破棄する必要があるのはなぜですか?
しかし...手順の最後にハッシュオブジェクトを単純に破棄すると:
hash.dispose()
アナライザーは、、、、、およびオブジェクトSHA1Managed
を破棄SHA256Managed
しSHA384Managed
ていないと不平を言います...そのうち4つは作成されませんでした...SHA512Managed
MD5CryptoServiceProvider
ステートメント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 アナライザーが、New <Object>
呼び出されたものをすべて、SELECT CASE
Using ブロックでラップするという回答は無効であり、コンパイルされません。