Avatar billede kmn_dk Nybegynder
10. september 2006 - 18:36 Der er 8 kommentarer og
1 løsning

Finalize & dispose

Nu er ikke lige ekspert i at skrive dispose og finalize metoder, men er nederstående kode ok, eller burde jeg lave nogle rettelser.

På forhånd tak

public class TestOra : IDisposable
{
    private bool disposed = false;
    private OracleConnection OracleCon = new OracleConnection ();
    private OracleCommand OracleCmd = new OracleCommand ();
    private OracleDataReader OracleDr;
       
    #region CleanUp Code
    public void Dispose ()
    {
        CleanUp (true);
        GC.SuppressFinalize (this);
    }
    private void CleanUp (bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                if (OracleDr is IDisposable)
                {
                    if (OracleDr != null)
                    {
                        OracleDr.Dispose ();
                    }
                }
                if (OracleCmd is IDisposable)
                {
                    if (OracleCmd != null)
                    {
                        OracleCmd.Dispose ();
                    }
                }
                if (OracleCon is IDisposable)
                {
                    if (OracleCon != null)
                    {
                        OracleCon.Dispose ();
                    }
                }
            }

        }
        disposed = true;
    }
    ~TestOra ()
    {
        CleanUp (false);
    }
    #endregion
}
Avatar billede arne_v Ekspert
10. september 2006 - 20:13 #1
MS har en lidt anden variant:

http://unvclx.sf.net/downloads/TurboMerger.zip

men jeg undrer mig meree over:

1)  hvorfor teste på is IDisposable ? de klasser ændrer da ikke hiraki runtime !

2)  hvorfor teste på != null ? de members er private - de kan da ikke blive null !

    (bortset fra readeren som nok slet ikke skal være i denne klasse anyway)
Avatar billede kmn_dk Nybegynder
10. september 2006 - 21:15 #2
linket virker ikke
Avatar billede kmn_dk Nybegynder
12. september 2006 - 13:46 #4
Hej arne

Tak for linket.

Til 1) af ren nysgerrighed kan du vise et eksemple på hvornår man tester på Idisposable, kun hvis du har tid?

til 2) Det har du ret mht. connection og command at de ikke kommer til at være null, men jeg synes at jeg har læst et sted at datareaderen default er null. kan det passe eller er jeg helt på afveje ?

Har revideret koden til følgende:

public class TestOra : IDisposable
{
    private bool disposed = false;
    private OracleConnection OracleCon = new OracleConnection ();
    private OracleCommand OracleCmd = new OracleCommand ();
    private OracleDataReader OracleDr;

    public TestOra ()
    {
        OracleCon.ConnectionString = ConfigurationManager.AppSettings["ConStr"];
    }

    #region CleanUp Code

    public void Dispose ()
    {
        Dispose (true);
        GC.SuppressFinalize (this);
    }
    protected virtual void Dispose (bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {                   
                if (OracleDr != null)
                {
                    OracleDr.Dispose ();
                }
               
                OracleCmd.Dispose ();
               
                OracleCon.Dispose ();                   
            }

        }
        disposed = true;
    }
    ~TestOra ()
    {
        Dispose (false);
    }

    #endregion
}

Venlig hilsen
Kristian
Avatar billede arne_v Ekspert
12. september 2006 - 20:38 #5
reader kan godt være null - jeg ved bare ikke om den naturligt hører
hjemme i den klasse - jeg ville finde det mere naturligt at den blev returneret
fra en metode og at den som kaldte metoden var ansvarlig for at
close den
Avatar billede arne_v Ekspert
12. september 2006 - 20:39 #6
jeg kan ikke lig etænke på noget godt eksempel på hvornår man vil teste
for IDisposable

man kalder Dispose og hvis den ikke er der får man en compile fejl
Avatar billede kmn_dk Nybegynder
12. september 2006 - 20:43 #7
Ok tak. en sidste ting =)

er der nogen grund overhoved at implimentere finalize metoden ~testOra() ?

da der ikke er noget unmanged resourcer ?

Arne opretter du ikke svar så jeg kan give dig points

Hilsen
Kristian
Avatar billede arne_v Ekspert
12. september 2006 - 21:33 #8
Den gør at hvis programmøren er et snøbel dyr og glemmer at kalde Dispose
så kalde .NET finalizeren lige inden GC og så kalder finalizeren Dispose eller Cleanup
Avatar billede arne_v Ekspert
12. september 2006 - 21:33 #9
og et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester