0

これは何度も議論されていることは知っていますが、解決策がうまくいかないようです。

私は機能を持っています:

Public Function Test() As Object
    Dim retVal As DisposableObject
    Dim tempRetVal As DisposableObject
    Try
        tempRetVal = New DisposableObject
        retVal = tempRetVal
        tempRetVal = Nothing
        Return retVal
    Catch
        tempRetVal.Dispose()
        Throw
    Finally
        tempRetVal.Dispose()
    End Try
End Function

ご覧のとおり、多くの Dispose ステートメントがあります。これは、私がそれを機能させる方法を見つけようとしていたからです。私が見つけた唯一の方法 (明らかに解決策ではありません) は、retVal.Dispose()retval を返す前に追加することでした。

 Public Function Test() As Object
    Dim retVal As DisposableObject
    Dim tempRetVal As DisposableObject
    Try
        tempRetVal = New DisposableObject
        retVal = tempRetVal
        tempRetVal = Nothing
        retVal.Dispose()
        Return retVal
    Catch
        tempRetVal.Dispose()
        Throw
    Finally
        tempRetVal.Dispose()
    End Try
End Function

どんなヒントでも大歓迎です!:)

注:VS2012を使用しています

編集: MSが提案した単純なテンプレートも試しましたが、どちらも機能しません:

Public Function Test() As Object
    Dim retVal As DisposableObject
    Dim tempRetVal As DisposableObject
    Try
        tempRetVal = New DisposableObject
        retVal = tempRetVal
        tempRetVal = Nothing
        Return retVal
    Finally
        if tempRetVal isnot Nothing then tempRetVal.Dispose()
    End Try
End Function

にCA2000を投入tempRetVal = New DisposableObject

4

1 に答える 1

0

私が見つけた唯一の方法 (これは明らかに解決策ではありません) は、retval を返す前に retVal.Dispose() を追加することでした。

なんで?とにかく、finallyブロックが定義されています。finally ブロックに処理を任せます。コードは次のようになります。また、

 Public Function Test() As Object
    Dim retVal As LLServerConnection
    Dim tempRetVal As LLServerConnection
    Try
        tempRetVal = New LLServerConnection
        retVal = tempRetVal
        tempRetVal = Nothing
        Return retVal
    Catch
        Throw
    Finally
        If Not tempRetVal Is Nothing Then
        tempRetVal.Dispose()
    End Try
End Function

詳細については、「 CA2000: スコープを失う前にオブジェクトを破棄する」を参照してください。

編集:

ブロックreturn内のステートメントが原因で、CA2000 警告メッセージが表示されていると思います。TRYむしろ、returnサブルーチンが実際に終了する前のオブジェクトです。変更にコメントが追加された以下のコードを参照してください。これで大丈夫でしょう。

Public Function Test() As DisposableObject //Change object to actual type DisposableObject
    Dim retVal As DisposableObject = Nothing
    Dim tempRetVal As DisposableObject = Nothing

    Try
        tempRetVal = New DisposableObject()
        retVal = tempRetVal
        tempRetVal = Nothing

    Finally
      If Not tempRetVal Is Nothing Then
         tempRetVal.Dispose()
      End If 

    End Try

        Return retVal //Return the object before your subroutine ends

End Function
于 2014-07-03T20:24:31.770 に答える