CA2000 предупреждение о возвращенном значении

Я знаю, что это обсуждалось много раз, но кажется, что решения не работают, поэтому я подумал, и, возможно, стоит попытаться открыть его снова, так как прошло некоторое время.

У меня есть функция:

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() перед возвращением

 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,

1 ответ

Решение

Единственный способ, который я нашел (что явно не является решением), - добавить retVal.Dispose() перед возвратом retval.

Зачем? У вас в любом случае есть 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: Удалите объекты перед тем, как потерять область видения для получения дополнительной информации

РЕДАКТИРОВАТЬ:

На мой взгляд, вы получаете это предупреждение CA2000 из-за return заявление внутри 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
Другие вопросы по тегам