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