Dispose a Finalize – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Dispose a Finalize – .NET – Fórum – Programujte.comDispose a Finalize – .NET – Fórum – Programujte.com

 

Jindra
~ Anonymní uživatel
19 příspěvků
13. 5. 2009   #1
-
0
-

Zdravim,

jsem celkem novy v ASP.NET, tak prosim o jednu radu.

Vytvarim zkusebni tridu na zapis do log souboru. Rad bych ji udelal se vsim vsudy, takze i Dispose a Finalize metody. Je tento kod v poradku, nebo je neco zbytecne navic / neco chybi ke spravnemu vytvoreni a zniceni tridy.



class LogIt: IDisposable
{
FileStream fsLog;
StreamWriter swLog;

public LogIt(string logFile)
{
fsLog = new FileStream(logFile, FileMode.Append);
swLog = new StreamWriter(fsLog);
}

public void Dispose()
{
swLog.Close();
swLog.Dispose();
swLog = null;

fsLog.Dispose();
fsLog = null;

GC.SuppressFinalize(this);
}


~LogIt()
{
this.Dispose();
}


}


Potom nekde v kodu se bude volat neco jako toto:



using (LogIt myLog = new LogIt("LogIt.txt"))
{
necoDelej();
}


Dekuji za vsechny rady,

Jindra

Nahlásit jako SPAM
IP: 195.113.80.–
rudolf_franek0
Stálý člen
14. 5. 2009   #2
-
0
-
Nahlásit jako SPAM
IP: 90.178.66.–
Miro17010
Stálý člen
15. 5. 2009   #3
-
0
-

ja by som si vytvoril:

public static class Logger

{
static bool active;
static Stream file;

public static void Activate(string filepath);
public static void Deactivate();
public static void Add(string whatyouwant);
}


z toho dovodu ze ak spustis nejaky prikaz vo vnutri nejakeho objektu a on by mal neco lognut tak on nebude poznat myLog, jedine ak by si vsade dal ref myLog.
a ak nechces aby ti teraz logovalo tak das disable

Nahlásit jako SPAM
IP: 85.248.47.–
začinajúci programátor v .Net: C# & OpenTK: OpenGL( pouzivam ), OpenAL( zatial nepouzivam ), OpenCL( este som neskusal )
Jindra
~ Anonymní uživatel
19 příspěvků
15. 5. 2009   #4
-
0
-

Diky za reakce.

Me slo predevsim o to, aby ten objekt byl za vsech okolnosti spravne odstranen z pameti. To, ze to nevo loguje do souboru neni az tak podstatne. Spis to beru jako nejakou kostru, jak dobre udelat finalize a dispoze.

Na tom prvnim http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx od rudolf_franek je to prave delany trochu jinak.

Jednak je pouzita promenna _disposed. je to nutny? Mohlo by se stat, ze se to bude disposovat dvakrat a hodi to nejakou chybu?

Test na nenullovost u me urcite chybi.


Dalsi dotaz z druheho linku:



public class DisposableClass : IDisposable
{
~DisposableClass()
{
Dispose(false);
}

public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// Clean up all managed resources
}

// Clean up all native resources
}
}


PREDEVSIM:co jsou managed a native resources? A proc se pri dispose odstanuji oboje a u finalizace jen native?


Predem dik.

Nahlásit jako SPAM
IP: 195.113.80.–
rudolf_franek0
Stálý člen
19. 5. 2009   #5
-
0
-

1) Unmanaged resource by ve vyse uvedenem pripade byl prave uvedeny Stream. Managed by mohla byt nejaka dalsi vlastni trida implementujici IDisposable. Nebo napriklad Image, ktery ma v sobe unmanaged resource - referenci na soubor, ze ktereho obrazek ctu.
2) To ze si nekam zaznamenam, ze probehnul korektne dispose je OK. Nejde o to, ze by podruhe v Dispose doslo k chybe, ale pokud je dobre napsany, pak by melo byt zbytecne volat ho dvakrat. I kdyz soucasne pokud je dobre napsany, tak by melo byt mozne ho volat kolikrat chces a nedojde k zadne chybe.
Z jine stranky jde ale take o to, ze nekdy se zavola explicitne Dispose (napriklad ve finally), nekdy je pouzit using a pokud nenastane ani jeden pripad, tak je nezbytne zavolat Dispose ve finalizaci - ale melo by byt zbytecne volat Dispose vickrat nez jednou (proto se pouziva mj. to GC.SuppressFinalize(this))
3) Proc se pri finalizaci odstranuji jen unmanaged resources ? Kdyz zavola program explicitne Dispose(), pak je na miste se zbavit vseho. Pokud se tak nestane a prestanu "pouze" objekt pouzivat - a Dispose(bool) se zavola az na popud garbage collectoru, pak je samozrejme treba uvolnit unmanaged resources - abych nekde na neznamem miste v pameti nedrzel napriklad otevreny soubor - ale managed resources by pravdepodobne mel GC zvladnout uvolnit sam.

Nahlásit jako SPAM
IP: 90.178.66.–
Jindra
~ Anonymní uživatel
19 příspěvků
20. 5. 2009   #6
-
0
-

To rudolf_franek :

Diky za odpovedi.

Takze kdyz tam ten boolovskej parametr nedam a uvolnim vzdycky vsechno, tak je to OK. Jen tim da se rict usnadnim praci GC, kterej to pak nebude muset dohledavat jako nepouzivany resources a rusit nasledne. Je to tak?


Nahlásit jako SPAM
IP: 195.113.80.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 6 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý