Megosztás a következőn keresztül:


Utasítás használata (Visual Basic)

Deklarálja a blokk elejét Using , és opcionálisan beolvasja a blokk által vezérelhető rendszererőforrásokat.

Syntax

Using { resourcelist | resourceexpression }
    [ statements ]
End Using

Részek

Időszak Definíció
resourcelist Kötelező, ha nem ad meg resourceexpression. Egy vagy több olyan rendszererőforrás listája, amelyet ez a Using blokk vezérel, vesszővel elválasztva.
resourceexpression Kötelező, ha nem ad meg resourcelist. Referenciaváltozó vagy kifejezés, amely egy olyan rendszererőforrásra hivatkozik, amelyet ez a Using blokk szabályoz.
statements Opcionális. A blokk futtatására Using vonatkozó utasítások blokkja.
End Using Szükséges. Leállítja a Using blokk definícióját, és megsemmisíti az általa vezérelt összes erőforrást.

A rész minden erőforrása resourcelist a következő szintaxist és részeket tartalmazza:

resourcename As New resourcetype [ ( [ arglist ] ) ]

-vagy-

resourcename As resourcetype = resourceexpression

resourcelist Parts

Időszak Definíció
resourcename Szükséges. Referenciaváltozó, amely egy olyan rendszererőforrásra hivatkozik, amelyet a Using blokk vezérel.
New Kötelező, ha az Using utasítás beszerzi az erőforrást. Ha már beszerezte az erőforrást, használja a második szintaxis alternatívát.
resourcetype Szükséges. Az erőforrás osztálya. Az osztálynak implementálnia kell az interfészt IDisposable .
arglist Opcionális. Azon argumentumok listája, amelyeket a konstruktornak ad át egy példány resourcetypelétrehozásához. Lásd: Paraméterlista.
resourceexpression Szükséges. Olyan változó vagy kifejezés, amely egy olyan rendszererőforrásra hivatkozik, amely megfelel a következő követelményeknek resourcetype: . Ha a második szintaxis alternatívát használja, az erőforrást be kell szereznie, mielőtt a vezérlőelemet átadta volna az Using utasításnak.

Megjegyzések

A kód néha nem felügyelt erőforrást, például fájlkezelőt, COM-burkolót vagy SQL-kapcsolatot igényel. A Using blokkok garantálják egy vagy több ilyen erőforrás elidegenítését, ha a kód elkészült velük. Így más kódhoz is elérhetővé válnak.

A felügyelt erőforrásokat a .NET-keretrendszer szemétgyűjtő (GC) semmisítse meg anélkül, hogy további kódolást alkalmaz az Ön részéről. A felügyelt erőforrásokhoz nincs szükség Using blokkra. A blokkok Using használatával azonban továbbra is kényszerítheti a felügyelt erőforrások ártalmatlanítását a szemétgyűjtőre való várakozás helyett.

A Using blokkok három részből állnak: beszerzés, használat és ártalmatlanítás.

  • A beszerzés azt jelenti, hogy létrehoz egy változót, és inicializálja azt, hogy a rendszererőforrásra hivatkozzon. Az Using utasítás egy vagy több erőforrást is beszerezhet, vagy pontosan egy erőforrást szerezhet be a blokk beírása és az utasításnak való Using átadása előtt. Ha megadja a elemet resourceexpression, be kell szereznie az erőforrást, mielőtt átadja a vezérlőt az Using utasításnak.

  • A használat azt jelenti, hogy hozzáfér az erőforrásokhoz, és műveleteket hajt végre velük. Az erőforrások közötti UsingEnd Using és azok közötti utasítások az erőforrások használatát jelölik.

  • Az elidegenítés azt jelenti, hogy meghívja a Dispose metódust az objektumon a következőben resourcename: . Ez lehetővé teszi, hogy az objektum teljesen leállítja az erőforrásait. Az End Using utasítás a blokk felügyelete alatt Using lévő erőforrásokat megsemmisíti.

Működés

A Using blokk úgy viselkedik, mint egy Try...Finally szerkezet, amelyben a Try blokk használja az erőforrásokat, és a Finally blokk megsemmisíti őket. Emiatt a Using blokk garantálja az erőforrások ártalmatlanítását, függetlenül attól, hogy hogyan lép ki a blokkból. Ez még kezeletlen kivétel esetén is igaz, kivéve a StackOverflowException.

Az utasítás által Using beszerzett összes erőforrásváltozó hatóköre a Using blokkra korlátozódik.

Ha egynél több rendszererőforrást ad meg az Using utasításban, az effektus ugyanaz, mintha egymásba ágyazott blokkokat ágyazott Using volna be.

Ha resourcename igen Nothing, nincs hívás Dispose , és nem történik kivétel.

Strukturált kivételkezelés egy használatblokkon belül

Ha olyan kivételt kell kezelnie, amely a Using blokkon belül fordulhat elő, hozzáadhat hozzá egy teljes Try...Finally konstrukciót. Ha kezelnie kell azt az esetet, amikor az Using utasítás nem sikerült az erőforrás beszerzésében, tesztelheti, hogy resourcename az-e Nothing.

Strukturált kivételkezelés használatblokk helyett

Ha pontosabban kell szabályoznia az erőforrások beszerzését, vagy további kódra van szüksége a Finally blokkban, átírhatja a Using blokkot ...Finally konstrukciókéntTry. Az alábbi példa azokat a csontvázakat Try és Using szerkezeteket mutatja be, amelyek egyenértékűek a beszerzéssel és az elidegenítéssel resource.

Using resource As New resourceType
    ' Insert code to work with resource.
End Using

' For the acquisition and disposal of resource, the following  
' Try construction is equivalent to the Using block.
Dim resource As New resourceType
Try
    ' Insert code to work with resource.
Finally
    If resource IsNot Nothing Then
        resource.Dispose()
    End If
End Try

Feljegyzés

A blokkon belüli Using kód nem rendelheti hozzá az objektumot resourcename egy másik változóhoz. Amikor kilép a Using blokkból, az erőforrás törlődik, a másik változó pedig nem tudja elérni azt az erőforrást, amelyre mutat.

Példa

Az alábbi példa egy log.txt nevű fájlt hoz létre, amely két sornyi szöveget ír a fájlba. A példa ugyanezt a fájlt is felolvassa, és megjeleníti a szöveg sorait:

Mivel az és TextReader az TextWriter osztályok implementálják az IDisposable interfészt, a kód utasításokkal biztosíthatjaUsing, hogy a fájl helyesen legyen lezárva az írási és olvasási műveletek után.

Private Sub WriteFile()
    Using writer As System.IO.TextWriter = System.IO.File.CreateText("log.txt")
        writer.WriteLine("This is line one.")
        writer.WriteLine("This is line two.")
    End Using
End Sub

Private Sub ReadFile()
    Using reader As System.IO.TextReader = System.IO.File.OpenText("log.txt")
        Dim line As String

        line = reader.ReadLine()
        Do Until line Is Nothing
            Console.WriteLine(line)
            line = reader.ReadLine()
        Loop
    End Using
End Sub

Lásd még