2014-02-24 7 views
17

Ich habe immer verwendet mit Variable und Zuweisung. Jetzt habe ich so eine Klasse DbProviderConnection:Was macht eine using-Anweisung ohne Variable bei der Entsorgung?

public class DbProviderConnection : IDisposable 
{ 
    public DbConnection Connection { get; set; } 
    public DbTransaction Transaction { get; set; } 

    public DbTransaction BeginTransaction() 
    { 
     Transaction = Connection.BeginTransaction(); 
     return Transaction; 
    } 

    //... and so on 
} 

Jetzt war ich thinkin es wie folgt zu verwenden:

using (DbProviderConnection cnctn = _planDb.CreateOpenConnection()) 
{ 
    using (cnctn.BeginTransaction()) 
    { 
     //... 
     cnctn.Transaction.Commit(); 
    } 
} 

Meine Frage ist: Ist der DbProviderConnection.Transaction.Dispose genannt?

+2

siehe [msdn] (http://msdn.microsoft.com/ru-ru/library/yh598w02.aspx), dispose wird – Grundy

+0

ok aufgerufen werden.es scheint, dass meine Frage war wieder schlecht gebildet ... Ich würde gerne wissen, was ist "State" von DbProviderConnection.Transaction Eigenschaft ... –

+0

@Grundy: Links zu lokalisierten MSDN-Seiten ist kein richtiger Weg zu gehen. – Dennis

Antwort

13

Von C# Specification 8.13 Anweisung definiert als

using-statement: 
    using (resource-acquisition) embedded-statement 

Wo ressourcen Erwerb

resource-acquisition: 
    local-variable-declaration 
    expression 

Im ersten Fall ist haben mit Ihnen die Ressource über lokale Variablendeklaration erwirbt . Im zweiten Fall wird die Ressource über den Ausdruck gewonnen. Also, im zweiten Fall Resuce wird Ergebnis von cnctn.BeginTransaction() Aufruf, die DbTransaction von Ihrem DbProviderConnection Klasse ist. Mit der Anweisung wird die Ressource nach der Verwendung freigegeben. Also, ja, DbProviderConnection.Transaction.Dispose() wird aufgerufen.

UPDATE:

8,13 Die Anweisung using

A mit: Nach demselben Artikel Ihre zweite wird mit Block

DbTransaction resource = cnctn.BeginTransaction(); 
try 
{ 
    //... 
    cnctn.Transaction.Commit(); 
} 
finally 
{ 
    if (resource != null) 
     ((IDisposable)resource).Dispose(); 
} 
+0

danke sergey! vor allem deine Ergänzung zur Antwort. –

+0

@matti welcome :) Ich habe auch Link zur Spezifikation hinzugefügt, die beschreibt, wie 'using' Anweisung funktioniert –

+0

Ich las das vor der Frage und bekam es nicht 100%. Was mich zögerte ist, dass ich die Transaktion DbProviderConnection.Transaction in BeginTransaction zuweisen. Wenn es nur eine Methode wäre, das Objekt zurückzugeben, hätte ich gewusst, dass es entsorgt wird. Aber es scheint, dass es keinen Unterschied macht. –

0

Das Objekt, das BeginTransaction zurückgibt, wird entsorgt.

Begintrans gibt ein DbTransaction so dass das, was entsorgt werden

ist
+3

das kennst du nicht. es kann auch OracleTransaction zurückgeben;) –

+0

was? das ist nicht wahr. in OracleConnection gibt es OracleTransaction zurück ... –

+0

Bitte bearbeiten Sie Ihre Antwort (entfernen Sie "returns' SqlTransaction' "). – Dennis

3

Ja, wird die Entsorgung genannt werden. Die Anweisung using funktioniert nur mit Einwegobjekten. Wie folgt aus:

using (DbProviderConnection cnctn = _planDb.CreateOpenConnection()) 
{ 
    using (cnctn.BeginTransaction()) 
    { 
     //... 
     cnctn.Transaction.Commit(); 
    } //HERE THE BEGIN TRANSACTION DISPOSE() METHOD IS BE CALLED. 
}//HERE THE DbProviderConnection DISPOSE() METHOD IS BE CALLED. 
3

Von der Spezifikation übersetzt werden Aussage des Formulars

using (ResourceType resource = expression) statement 

wenn Resource ein nullable Werttyp ist oder eine Referenz anderer Typ als dynamisch, die Erweiterung ist

{ 
    ResourceType resource = expression; 
    try { 
     statement; 
    } 
    finally { 
     if (resource != null) ((IDisposable)resource).Dispose(); 
    } 
} 

A unter Verwendung Anweisung der Form

using (expression) statement 

die gleichen drei möglichen Erweiterungen aufweist. ..Auf die Ressourcenvariable kann in der eingebetteten Anweisung nicht zugegriffen werden.

Daher wird das Objekt, das von cnctn.BeginTransaction() zurückgegeben wird, beim Verlassen des Blocks entsorgt, ist aber innerhalb des zugehörigen Blocks nicht zugänglich.