Как избежать предупреждения отладчика в операторе 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 так что вам даже не нужна эта строка

Другие вопросы по тегам