1

編集:

この質問は重複していません!おそらくよくある質問は「この警告はどういう意味ですか?」ですが、特定のコードで警告を修正する方法を尋ねているときは重複していません。警告の意味。–


VS でコードを分析すると、次の警告が表示されます。

CA2202 オブジェクトを複数回破棄しないでください オブジェクト 'OutputStream' は、メソッド 'FileSplitter.Split(String, Long, String, String, Boolean, Boolean)' で複数回破棄できます。System.ObjectDisposedException の生成を回避するには、オブジェクトに対して Dispose を複数回呼び出さないでください。 行: 490 WindowsApplication1 FileSplitter.vb 490

490は次のとおりです。

End Using ' OutputStream

そして、行の他のオブジェクトについても同じ警告が表示されます498。これは次のとおりです。

End Using ' InputStream

しかし、Usingキーワードを適切に使用しており、オブジェクトを複数回破棄していないと思います。何か間違ったことをしている場合、どうすればコードを修正できますか?

これは完全なブロックです:

    ' Open the file to start reading bytes.
    Using InputStream As New FileStream(fInfo.FullName, FileMode.Open)

        Using BinaryReader As New BinaryReader(InputStream)

            While (InputStream.Position < InputStream.Length)

                ' Create the chunk file to Write the bytes.
                Using OutputStream As New FileStream(ChunkFile, FileMode.Create)

                    Using BinaryWriter As New BinaryWriter(OutputStream)

                        ' Read until reached the end-bytes of the input file.
                        While (SizeWritten < ChunkSize) AndAlso (InputStream.Position < InputStream.Length)
                            ' Some irrelevant code here...

                        End While ' (SizeWritten < ChunkSize) AndAlso (InputStream.Position < InputStream.Length)

                        OutputStream.Flush()

                    End Using ' BinaryWriter

                End Using ' OutputStream

            End While ' InputStream.Position < InputStream.Length

        End Using ' BinaryReader

    End Using ' InputStream

アップデート

try/catch ブロックを追加した後も、同じ警告が表示されます。最後の try/catch を削除すると、警告が 1 つだけ表示されます。

    ' Open the file to start reading bytes.
    Dim InputStream As Stream = Nothing

    Try

        InputStream = New FileStream(fInfo.FullName, FileMode.Open)
        Using BinaryReader As New BinaryReader(InputStream)

            While (InputStream.Position < InputStream.Length)

                ' Create the chunk file to Write the bytes.
                Dim OutputStream As Stream = Nothing

                Try
                    OutputStream = New FileStream(ChunkFile, FileMode.Create)
                    Using BinaryWriter As New BinaryWriter(OutputStream)

                        ' Read until reached the end-bytes of the input file.
                        While (SizeWritten < ChunkSize) AndAlso (InputStream.Position < InputStream.Length)

                    End Using ' BinaryWriter

                Catch ex As Exception
                    Throw New Exception(ex.Message)

                Finally
                    If OutputStream IsNot Nothing Then
                        OutputStream.Dispose()
                    End If

                End Try

            End While ' InputStream.Position < InputStream.Length

        End Using ' BinaryReader

    Catch ex As Exception
        Throw New Exception(ex.Message)

    Finally
        If InputStream IsNot Nothing Then
            InputStream.Dispose()
        End If

    End Try
4

1 に答える 1

2

この問題の理由はコードからは明らかではありませんが、関連するオブジェクトに関するコード分析の知識にすぎません。

具体的には、 または のいずれかのインスタンスを作成するときBinaryReaderBinaryWriter、基になるストリームの所有権をそれらのオブジェクトに渡します。したがって、リーダー/ライター オブジェクトを破棄すると、ストリームも破棄されます。

そのため、リーダー/ライター オブジェクトを破棄した後で基になるストリームを破棄すると、コード分析はこれについて警告します。

さて、これは問題になるでしょうか?いいえ。

あなたはそれを修正する必要がありますか?一般に、コード分析を有効にする場合は、特に理由がない限り、すべてのエラーまたは警告を修正する必要があります。

この問題を「正しく」解決するには、外側のストリームを try/finally ブロックでラップするのが通例であり、リーダー/ライターが構築されていないコードが何らかの形で finally ブロックに到達した場合にのみ、これを破棄します。

つまり、実際にオブジェクトの所有権をリーダー/ライター オブジェクトに与えていない場合にのみ、基になるストリームを破棄する必要があります。

特定のルールは、これを行う方法の例も示していると思います。

于 2014-08-15T17:13:31.293 に答える