Как избежать предупреждения отладчика в операторе IsNothing()
Я использую Visual Studio 2012 и у меня есть следующий блок кода. Код проверяет тип файла определенного файла (поэтому в нем возвращаются значения True/False). Если он обнаруживает ошибку, он также возвращает false. Я получаю предупреждения о том, что я использую переменные fs / br до их инициализации, и это правда. Вот почему у меня есть утверждения IsNothing, но я получаю предупреждение в утверждениях IsNothing и не знаю, как этого избежать, потому что не хочу ставить fs = New FileStream(fn, FileMode.Open)
а также br = ...
операторы вне блока Try/Catch.
Сам код работает, поэтому предупреждение не является проблемой, но я все еще беспокоюсь о том, чтобы иметь их. Кто-нибудь видит решение, как этот блок может быть изменен, чтобы предложить ту же безопасность без предупреждений?
Оба VB.NET или C# ответы приветствуются.
Dim fs As FileStream
Dim br As BinaryReader
Try
fs = New FileStream(fn, FileMode.Open) 'Open the file
br = New BinaryReader(fs) 'Initilize the reader
'File reading code omitted here
br.Close() 'Close the reader and underlying stream
Catch
If Not IsNothing(fs) Then fs.Close() 'Warning here
If Not IsNothing(br) Then br.Close() 'and here
Return False
End Try
2 ответа
Вот почему у меня есть заявления IsNothing
Это предполагает, что вы ожидаете, что значения будут IsNothing, прежде чем им будет присвоено определенное значение. В C# это было бы не просто предупреждением, а ошибкой.
У меня есть два предложения:
Если вы действительно хотите следовать этому шаблону, просто установите значения
Nothing
начать с:Dim fs As FileStream = Nothing Dim br As BinaryReader = Nothing
- Если возможно, реорганизуйте свой код, чтобы вы могли просто использовать
Using
операторы вместо этого, которые в любом случае закроют потоки в конце блока. Мы не можем рассказать достаточно об остальной части кода, чтобы помочь вам сделать это в данный момент.
Вы можете переписать это без необходимости использовать вложенный блок Using - вы можете сделать все это в одной строке - я не верю, что вы можете сделать это в C#:
Try
Using fs As New FileStream(fn, FileMode.Open), br As New BinaryReader(fs)
Try
Catch ex As Exception
'an exception here indicates an issue reading the file
End Try
End Using
Catch ex As Exception
'an exception here indicates an issue opening the filestream or reader
End Try
Блок using обеспечивает удаление объектов без необходимости явного вызова .Dispose
это также вызывает .Close
так что вам даже не нужна эта строка