Antwort an „Rolf B“ verfassen

Hallo Henry,

auch wenn ich dienstlich immer noch bei C# 7 stecke (weil wir .net Framework 4.x verwenden), hab ich das schon mal gesehen und kann Dir den Tipp geben.

using-Anweisung versus using-Deklaration

Das ist etwas, das mit C# 8 eingeführt wurde und was ich persönlich für einen grandiosen Missgriff halte. Man verwechselt es sehr leicht. So wie Du. C# führt eine Menge Bequemlichkeits-"Verbesserungen" ein, die man aber genau kennen muss, um darauf nicht reinzufallen.

Du hast die Deklaration verwendet, nicht die Anweisung. Die geschweiften Klammern hinter der Deklaration sind deshalb lediglich Dekoration, der Reader wird erst am Ende des try-Blocks verworfen.

Ich zeig's mal kürzer. Hinweis zu var: während JavaScript die var-Deklaration abschafft, führt C# sie ein. Man kann sie verwenden, wenn der Typ der Variablen aus dem Kontext klar ist (hier durch die Methodensignatur) und spart sich Tipparbeit.

try 
{
   using (var rdr = cmd.ExecuteReader())   // Anweisung!
   {   // <-- Scope-Beginn von rdr 
       // tu was mit dem Reader
       // Dispose erfolgt hier
   }   // <-- Scope-Ende von rdr 
   // der Reader ist weg, rdr gilt nicht mehr
   // Neues Statement kann ausgeführt werden
   cmd.CommandText = ...
   cmd.ExecuteNonQuery();
}
catch () ...
try 
{  // <-- Scope-Beginn von rdr 
   using var rdr = cmd.ExecuteReader();   // Deklaration!
   {   // <-- Statement-Block ohne besondere Wirkung
       // tu was mit dem Reader
   }
   // der Reader ist immer noch da
   // eins der beiden folgenden Statements crasht
   cmd.CommandText = ...
   cmd.ExecuteNonQuery();

   // Dispose erfolgt hier
}  // <-- Scope-Ende von rdr 
catch () ...

Du siehst den Unterschied in der Schreibweise? Der Unterschied in der WIRKUNG ist, dass die Deklaration den Reader disposed, wenn der Block endet, in dem sich die Deklaration befindet. Die Anweisung hingegen hat einen untergeordneten Block, an dessen Ende der Dispose erfolgt.

Rolf

--
sumpsi - posui - obstruxi
freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar

Ihre Identität in einem Cookie zu speichern erlaubt es Ihnen, Ihre Beiträge zu editieren. Außerdem müssen Sie dann bei neuen Beiträgen nicht mehr die Felder Name, E-Mail und Homepage ausfüllen.

abbrechen