вызывать функцию Dispose () после FlushFinalBlock ()? - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть следующий код:

Public Shared Function Crypt(text As String) As String
    If text <> "" Then
        Dim cryptoProvider As New DESCryptoServiceProvider()
        Dim ms As New MemoryStream()
        Dim cs As New CryptoStream(ms, cryptoProvider.CreateEncryptor(KEY_64, IV_64), CryptoStreamMode.Write)
        Dim sw As New StreamWriter(cs)

           sw.Write(text)
           sw.Flush()
           cs.FlushFinalBlock()
           ms.Flush()

        'convert back to a string
        Return Convert.ToBase64String(ms.GetBuffer(), 0, CInt(ms.Length))
    End If

    Return ""

End Function

после сканирования Fortify, они сообщают, что мне нужно освободить объект cs CryptoStream.

Насколько я знаю, FlushFinalBlock () метод делает это эту работу.

Нужно ли мне вызывать функцию disponse ()? Или может быть это ложноположительный вопрос?

1 Ответ

1 голос
/ 08 февраля 2020

Любой объект, который реализует интерфейс IDisposable и используется только в пределах одного блока, должен быть создан с оператором Using. Таким образом, он гарантированно будет размещен в конце блока Using. Это применимо, даже если выполняется оператор Return или выбрасывается исключение. В вашем случае вы создаете четыре одноразовых объекта. Код не требуется между созданием каждого объекта или уничтожением каждого объекта, поэтому вам не нужно несколько вложенных блоков Using. Вы должны использовать один оператор Using для всех них:

Using cryptoProvider As New DESCryptoServiceProvider(),
      ms As New MemoryStream(),
      cs As New CryptoStream(ms, cryptoProvider.CreateEncryptor(KEY_64, IV_64), CryptoStreamMode.Write),
      sw As New StreamWriter(cs)
    '...
End Using
...