0

プロジェクトでコード分析を実行しようとすると、コードのこの部分でエラーが発生します。

//コード

  Private Sub SaveMaterialStatus(ByVal status As String)

        Dim cSMaterialInput As CSMaterialInput = Nothing

        Try

            If ViewState("CSInput") IsNot Nothing Then
                'Create a new transaction
                cSMaterialInput = New CSMaterialInput
                cSMaterialInput = ViewState("CSInput")
                cSMaterialInput.CSStatus = status
                CSMaterialInputMethods.SaveToDatabase(cSMaterialInput, Environment.UserName, Environment.MachineName)

            End If
        Catch ex As Exception
            Throw

        Finally
            If cSMaterialInput IsNot Nothing Then cSMaterialInput.Dispose()

        End Try
    End Sub

詳細なエラー:

CA2000  Dispose objects before losing scope In method 'ShowSummary.SaveMaterialStatus(String)', call System.IDisposable.Dispose on object 'cSMaterialInput' before all references to it are out of scope.   xxxx.CostingTool.Presentation   ShowSummary.aspx.vb 790

どこが間違っていますか??

4

1 に答える 1

0
 cSMaterialInput = New CSMaterialInput

そこから問題が始まりました。作成したオブジェクトが破棄されないように、次のステートメントですぐに変数を再割り当てします。CA2000警告を引き起こしたもの。まったく使用しない新しいオブジェクトを作成しても意味がありません。メソッドには他にほとんど残っていません。

  Private Sub SaveMaterialStatus(ByVal status As String)
      Dim cSMaterialInput = ViewState("CSInput")
      If cSMaterialInput IsNot Nothing Then
          cSMaterialInput.CSStatus = status
          CSMaterialInputMethods.SaveToDatabase(cSMaterialInput, Environment.UserName, Environment.MachineName)
      End If
  End Sub

Nothing テストでは、依然として重大なコードの匂いがします。あなたのプログラムが何も保存しようとしないとき、それはバグを隠しているだけです。

于 2013-06-21T10:56:29.690 に答える