2017-01-19 1 views
1

Anfangs hatte ich einige Code wie folgt aus:Muss C# using Anweisung zugewiesen werden?

WindowsIdentity otherIdentity = // got that from somewhere else 
WindowsImpersonationContext context = otherIdentity.Impersonate(); 
Ldap.DoStuff(); 
context.Undo(); 
context.Dispose(); 

Zu wissen, dass WindowsImpersonationContext implementiert IDisposable und Dispose() nennt auch Undo(), ich glaube, sollte ich using stattdessen werden:

using (var context = otherIdentity.Impersonate()) 
{ 
    // Run as other user 
    Ldap.DoStuff(); 
} 

Nun ReSharper richtig bemerkt dass ich context nicht verwende und vorschlage, die Zuordnung zu entfernen. Funktioniert das auch? Um welchen Code erweitert es sich zur Kompilierzeit?

using (otherIdentity.Impersonate()) 
{ 
    Ldap.DoStuff(); 
} 
+2

Um zu testen, ob das funktioniert, bauen und ausführen. – adv12

+0

@ adv12: Es wird auf jeden Fall funktionieren, egal ob das Objekt entsorgt wird oder nicht, und der Müllsammler entsorgt es trotzdem irgendwann. Aber selbst wenn 'using' es entsorgt, frage ich mich wie. Behält die Anweisung eine unbenannte Referenz des Ausdrucksergebnisses bei? Von allen Ausdrucksergebnissen? Die Dokumentation erwähnt nie, dass ... – Hannobo

+2

Ich würde 'try-finally' anstelle von' using' hier verwenden. Der Widerruf von Identitätswechsel ist wichtig und sollte im Code hervorgehoben, nicht versteckt werden. –

Antwort

0

Ja, können Sie die Variable in einer using Anweisung weglassen kann, und der Compiler eine versteckte Variable automatisch vorstellen, als ob Sie außer

using (var temp = otherIdentity.Impersonate()) 
{ 
    Ldap.DoStuff(); 
} 

geschrieben hatte, dass man nicht temp in der Zugriff auf Körper der using Aussage.

Seltsamerweise scheint diese Syntax in MSDN Library nicht dokumentiert zu sein. Vielmehr beziehen sich auf die C# Spezifikation:

A unter Verwendung Anweisung der Form

using (ResourceType resource = expression) statement 

auf eine von drei möglichen Erweiterungen entspricht.

[...]

Eine using Anweisung der Form

using (expression) statement 

hat die gleichen drei mögliche Erweiterungen. In diesem Fall ist ResourceType implizit der Kompilierzeittyp des expression, falls er eins hat. Ansonsten wird die Schnittstelle IDisposable selbst als ResourceType verwendet. Auf die resource-Variable kann in der eingebetteten Anweisung nicht zugegriffen werden.

Verwandte Themen