2014-09-08 4 views
1

Если я инициализирую класс оператором Using, нужно ли его вызвать метод Close досрочного расторжения?Нужно ли называть «Закрыть», когда в заявлении «использовать» при раннем завершении процесса?

Using xmlstream As New MemoryStream() 
    Try 
     'Do runtime operation 

    Catch ex As Exception 
     Console.WriteLine("Could not fill dataset. REASON: " & ex.Message) 
     xmlstream.Close() '<- NECESSARY???? 
     Environment.Exit(-1) '<- Early termination! 
    End Try 
    'DO STUFF 
End Using 
+1

Нет, End Using будет обслуживать для него –

ответ

3

Не нужно. По the IDisposable.Dispose Method documentation

«используя оператор автоматически закрывает поток и вызывает Dispose на объекте, когда код, который использует его завершения»

Сказав, что это не очень хорошая идея, чтобы иметь Environment.Exit в a Использование блока, так как это не вызывает Close, или действительно Dispose. Вместо этого вы должны реорганизовать это как функция, которая возвращает истину или ложь и действовать на этом возвращаемое значение, чтобы решить, будет ли для выхода или не

+0

Добра. Не нужно беспокоиться о вызове метода close удобно. – 2014-09-08 14:17:48

+0

@ OlivierJacot-Descombes, что я сказал в последнем абзаце –

1

Как вы можете переписывать таким образом. О, что вы спросили, программа оставит закрытие метода O.S.

Try 

      Using xmlstream As New MemoryStream() 
      'Do runtime operation 


     End Using 

Catch ex As Exception 
         Console.WriteLine("Could not fill dataset. REASON: " & ex.Message)   
         Environment.Exit(-1) 
        End Try 
        'DO STUFF 
0

Декомпилятор показывает, что Dispose метод вызывается в конце Using -statement реализуется как это :

Public Sub Dispose() Implements IDisposable.Dispose 
    Me.Close() 
End Sub 

Он реализуется базовым классом System.IO.Stream.

Однако, поскольку вы звоните Environment.Exit(-1), код отменяется, а метод Dispose НЕ ЗВОНИТЕ! Вы можете проверить его с помощью этого класса:

Class Disp 
    Implements IDisposable 
    Public Sub Dispose() Implements IDisposable.Dispose 
     MsgBox("Disposing") 
    End Sub 
End Class 

и этот код:

Private Sub btnTest_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnTest.Click 
    Dim x = 100, y = 0, z = 0 
    Using d = New Disp() 
     Try 
      z = x \ y 
     Catch ex As Exception 
      Environment.Exit(-1) 
     End Try 
    End Using 
End Sub 

Он должен показывать «Располагая» в окне сообщения, но не делает! Если вы прокомментируете Environment.Exit(-1), появится сообщение.

Оператор Using выполнен в виде инструкции Try Finally, поэтому ваш код эквивалентен двум вложенным блокам Try ... End Try. Документация Microsoft для Environment.Exit Method гласит: «... Если Exit вызывается из блока try или finally, код в любом блоке catch не выполняется ...». Но в документации неясно, выполняется ли блок finally или нет. Документация Try...Catch...Finally Statement, однако, говорит:

управление не проходит из блока Try или Выгоды к соответствующим Наконец блоку в следующих случаях:

• концевого заявления встречаются в пробном или Вылове блок.

• Исключение StackOverflowException в блоке Try or Catch.

В документации для End Statement говорится: «Оператор End вызывает метод Exit класса Environment в пространстве имен System. ...».

Наконец, вкладывая эти информации вместе, мы можем сказать:
      Да, вы должны позвонить xmlstream.Close() перед вызовом Environment.Exit(-1)!

Смотрите также: Calling Environment.Exit() Within a Using Block

 Смежные вопросы

  • Нет связанных вопросов^_^