2011-12-02 17 views
6

Wiele osób z SO wskazało, że powinienem częściej używać instrukcji using. Więc praktykuję.Podczas korzystania z instrukcji należy używać?

Problem polega na tym, że nie mogę zdecydować, kiedy go używać i kiedy go nie używać. Kiedy myślę, że powinienem go używać, wtedy pojawiają się błędy takie jak w tym przykładzie (. PS HashPhrase to klasa stworzona przeze mnie):

 using (HashPhrase hash = new HashPhrase()) 
     { 
      connection.ConnectionString = 
       "Provider=Microsoft.ACE.OLEDB.12.0;" + 
       "Data Source=" + filePath + ";" + 
       "Persist Security Info=False;" + 
       "Jet OLEDB:Database Password=" + hash.ShortHash(pass) + ";"; 
     } 

Ale to daje mi błąd: 'Password_Manager.HashPhrase': type used in a using statement must be implicitly convertible to 'System.IDisposable'

ale w ten przykład działa dobrze:

using (OleDbConnection connection = new OleDbConnection()) 
    { 
     connection.ConnectionString = 
      "Provider=Microsoft.ACE.OLEDB.12.0;" + 
      "Data Source=" + filePath + ";" + 
      "Persist Security Info=False;" + 
      "Jet OLEDB:Database Password=" + hash.ShortHash(pass) + ";"; 

     using (OleDbCommand command = new OleDbCommand(sql, connection)) 
     { 
      try 
      { 
       connection.Open(); 
       command.ExecuteNonQuery(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Error: " + ex.Message); 
      } 
     } 
    } 

Czy istnieją jakieś wytyczne szybki sposób określić, kiedy należy stosować using stwierdzenie?

Odpowiedz

14

Twoje pytanie już dotyczy odpowiedzi.

Jeśli typ implementuje interfejs IDisposable, należy zawsze starać się używać using (to znaczy zawsze, o ile nie ma do tego nieodpartego powodu).

Jeśli typ nie implementuje IDisposable, nie można użyć using, a kompilator powie, że tak, jak już odkryłeś.

+0

To ma sens. – HelpNeeder

+1

@downvoter: Czy chciałbyś wyjaśnić powody upadku? – LukeH

4

Należy użyć instrukcji using, gdy klasa implementuje interfejs IDisposable.

Jest to skrót do zawijania obiektu w bloku try-finally, aby zapewnić, że metoda obiektu jest zawsze wywoływana w celu zwolnienia dowolnych zasobów, niezależnie od tego, czy zgłoszony zostanie wyjątek.

Aby to sprawdzić, kliknij prawym przyciskiem myszy nazwę klasy w Visual Studio i wybierz opcję Przejdź do deklaracji, aby otworzyć ją w przeglądarce obiektów. Następnie możesz łatwo sprawdzić, czy klasa lub jej typy bazowe implementują IDisposable.

+0

+1 za referencję :) – HelpNeeder

4

W

using (var r = new R()) 
{ 
    // use r 
} 

klasy R powinna implementować interfejs IDisposing.

2

Najprostszym sposobem jest sprawdzenie, czy obiekt implementuje interfejs IDisposable. Kliknij prawym przyciskiem myszy dany obiekt/klasę, wybierz Przejdź do definicji z menu rozwijanego (lub naciśnij klawisz F12) i zobacz, czy klasa implementuje IDisposable. Uwaga: w klasie implementującej wiele interfejsów/inne klasy może być konieczne sprawdzenie tych klas, aby sprawdzić, czy implementują również IDisposable.

Powiązane problemy