using kræver for det første at den variabeltype man bruger det sammen med er defineret til at arve fra IDisposable. Dette betyder at den også har implementeret en Dispose-metode som står for at lave en del rengøring når variablen slettes.
Når du skriver:
using (variable = etellerandet) { også noget kode }
- så betyder det blot at variablen ”variable” oprettes i forbindelse med using-deklarationen og at den slettes igen lige så snart at den afsluttende tuborg passeres.
Fra msdn : The using statement defines a scope at the end of which an object will be disposed. using (expression | type identifier = initializer) statement where: expression An expression you want to call Dispose on upon exiting the using statement. type The type of identifier. identifier The name, or identifier, of the type type. It is possible to define more than one identifier of type type. Precede each identifier = initializer with a comma. initializer An expression that creates an object. statement The embedded statement or statements to executed. Remarks You create an instance in a using statement to ensure that Dispose is called on the object when the using statement is exited. A using statement can be exited either when the end of the using statement is reached or if, for example, an exception is thrown and control leaves the statement block before the end of the statement. The object you instantiate must implement the System.IDisposable interface. Example // cs_using_statement.cs // compile with /reference:System.Drawing.dll using System.Drawing; class a { public static void Main() { using (Font MyFont = new Font("Arial", 10.0f), MyFont2 = new Font("Arial", 10.0f)) { // use MyFont and MyFont2 } // compiler will call Dispose on MyFont and MyFont2
Font MyFont3 = new Font("Arial", 10.0f); using (MyFont3) { // use MyFont3 } // compiler will call Dispose on MyFont3
okey, det vil sige hvis nu jeg har en class som jeg selv har lavet til at conn til min database så ville jeg kunne tilføje en IDisposable og en deconstorut (~ metode) i min klasse og der ville jeg kunne f.eks kunne lukke min forbindelse?
Et program bruger resourcer – din database er f.eks. godt eksempel. Disse ressourcer kan være enten managed eller unmanaged; Dvs. under kontrol af CLR’et eller ikke. Så længe dit database stsyem ikke direkte er udviklet til at spille sammen med .NET så er de unmanaged. Og det er det med garanti i skrivende stund.
CLR’et kommer med en god indbygget Garbaga Collection. Problemet er at denne kun kan rydde op efter brugen af managed kode. Den kan ikke rydde op efter unmanaged kode, og det er netop den slags som resultere i memoryleaks.
For at sikre sig er man altså selv nødt til gøre skrive den reelevante kode, og det er her at IDisposable kommer ind. Man placere simpelthen den kode som rydder op i ens unmanaged resourcer i Dispose metoden.
"Managed kode" er det kode som afvikles via CLR'et. "Unmanaged kode" er "gammel kode" som ikke direkte er kendt af CLR'et (altså af .NET frameworket). Det udvikles derfor ikke via CLR'et - det er unmanaged (ustyret).
-- men umiddelbart vil man benytte sig af de i frameworket indbyggede metoder til at lave en connection til en database, og så er oprydningsmetoderne indbyggede ...
-- men using ser ud til at være nyttig på den måde, at du ikke selv har brug for at kalde oprydningen, da det sker som en del af afslutningen på using-clausen !-)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.