2016-04-26 6 views
0

Zum Beispiel kann eine neue Instanz einer Wegwerf-Ressource kann erstellt werden:Erstellen eine Ressource in der Verwendung von Block vs außerhalb des mit Block

var resource = CreateNewResource(); 

Was ist der Unterschied, wenn überhaupt, in den folgenden Arten von Kodierung?

Erste Art:

var resource = CreateNewResource(); 
using (resource) 
{ 
    //Use resource 
} 

Zweite Art:

using (var resource = CreateNewResource()) 
{ 
    //Use resource 
} 

Ist die erste Stil schlechte Codierung der Praxis, wenn wir gehen, um nicht irgendwo außerhalb des mit Block die Ressource zu verwenden?

Auch wenn wir wollen die Ressource außerhalb der Verwendung von Block zu verwenden, soll dieser Wunsch eine Wegwerf-Ressource außerhalb der Verwendung von Block mit gefördert werden?

+0

Der Unterschied liegt in der Verfügungszeit der Instanz der Klasse. Bei der Verwendung von block wird die Instanz der Klasse nach dem Verlassen des Blocks entsorgt. –

+0

@SiyavashHamdi: Ich habe so viel erraten. Was passiert beim ersten Codierungsstil? Ist es nur oberflächlich, nach dem ersten Stil zu programmieren? Ich habe diesen Stil an zahlreichen Orten gesehen. – displayName

+0

@SiyavashHamdi: Was passiert mit der Ressource im ersten Stil? – displayName

Antwort

5

Der erste bemerkenswerte Unterschied ist die Tatsache, dass in Ihrem ersten Snippet die variable Ressource immer noch nach dem using-Block deklariert wird und jemand sie verwenden könnte, nachdem sie entsorgt wurde, was schlecht ist.

var resource = CreateNewResource(); 
using (resource) 
{ 
    //Use resource 
} 
... 
// Unknowingly continues to use resource 
resource.BadActOnDisposedObject(); 

Wenn Sie entschieden verwenden möchten und ordnen Sie Ihre Ressourcen frei, würde ich vorschlagen, versuchen Sie es mit/finally, etwa so:

Resource resource = null; 
try 
{ 
    // do whatever 
    resource = CreateNewResource(); 
    // continue to do whatever 
} 
finally 
{ 
    if (resource != null) 
    { 
     resource.Dispose(); 
     resource = null; 
    } 
} 

Dies garantiert, dass Ihre Ressource in jedem Fall angeordnet ist.

+0

Ok. Offensichtlich der erste Stil, den ich gesehen habe mehrere Plätze sind dann schlecht. – displayName

+0

@displayName Wo hast du gesehen? In öffentlichen Code oder an deinem Arbeitsplatz? –

+0

@DStanley: Ups .. Ich bin gefangen. Kann nicht wirklich sagen, wo ich es sah. Sie können eine machen rate: D – displayName

0

Ok .. so ist es eindeutig eine schlechte Praxis.

Ziemlich gut documented on MSDN:

Sie können das Ressourcenobjekt instanziiert und dann die Variable übergeben Sie die Anweisung using , aber dies ist nicht eine bewährte Methode. In diesem Fall bleibt das Objekt im Bereich, nachdem Kontrolle den using-Block sogar verlässt, obwohl es wahrscheinlich nicht mehr Zugriff auf seine nicht verwalteten -Ressourcen haben wird. Mit anderen Worten, es wird nicht mehr vollständig initialisiert. Wenn Sie versuchen, das Objekt außerhalb des using-Blocks zu verwenden, riskieren Sie, dass eine -Ausnahme ausgelöst wird. Aus diesem Grund ist es im Allgemeinen besser, das Objekt in der using-Anweisung zu instanziieren und seinen Gültigkeitsbereich auf den using-Block zu beschränken.

Ich sah diesen Stil irgendwo online. In meinem eigenen Code, wenn die Deklaration der Ressource in Stil 2 sehr lang war, zog ich die Deklaration aus using(){} und schrieb dann den Code wie in Stil 1 erwähnt, um den Code lesbarer zu machen.

+0

Wenn die Lesbarkeit ein Problem darstellt, können Sie Zeilenumbrüche innerhalb der 'using()' -Deklaration haben und den inneren Teil in eine separate Zeile einfügen. –

+0

@DStanley: Manchmal ist der Aufruf wie 'var resource = CreateNewResourceByCallingALargeNamedMethod (abc, def, ghi, jklnopqrstu, vwxyz);' Die Methode hat einen langen Namen und benötigt so viele lange benannte Argumente. In Visual Studio wird der Text umbrochen und durch Kommas getrennt. Es gibt einfach keine Möglichkeit, das zu schreiben, was lesbar ist. Man kann es auf mehrere Zeilen aufteilen, wobei jeder Eingabe eine eigene Zeile zugewiesen wird, die jedoch den Verwendungsblock unnötig verlängert. – displayName

Verwandte Themen