Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

Diskusia – 1. diel - Výnimky

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
Kit
Tvůrce
Avatar
Kit:16.6.2012 15:57

Překvapil mě blok finally. Nikdy jsem ho nepotřeboval, neboť o uzavření souboru apod. se mi vždy postaral destruktor, který jsem zpravidla ani nemusel psát.

Dále mě překvapila neexistence parametrů bloku catch. To by znamenalo, že výjimka může být pouze jedna nepojmenovaná a není možné jí předat parametry. Ovšem po nahlédnutí do manuálu MSDN jsem zjistil, že parametry jsou volitelné a že dokonce může být víc bloků catch za sebou.

Použití throw bude asi příště.

Odpovedať
16.6.2012 15:57
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na Kit
David Hartinger:16.6.2012 16:13

V C# by bez použití using zůstal soubor otevřený, pokud vím, tak se zde destruktory z nějakého důvodu nepoužívají.

Ano, zbytek příště, již to mám z 75% napsané :)

Odpovedať
16.6.2012 16:13
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na Kit
David Hartinger:16.6.2012 16:25

Teď mě napadlo, že je to asi proto, že se o správu paměti stará garbage collector. Nevíme přesně, kdy se spustí a kdy se destruktor provede. Mohla by vzniknout prodleva mezi ukončením metody a uzavřením souboru.

Odpovedať
16.6.2012 16:25
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovedá na David Hartinger
Kit:16.6.2012 16:26

Odpověď jsem našel zde:
http://www.c-sharpcorner.com/…ructors.aspx

Podle toho destruktory v C# de facto neexistují. Automatický destruktor je vlastně jen zametač neodkazovaných objektů. Jako obvykle si MS vysvětlil objektové programování po svém.

Odpovedať
16.6.2012 16:26
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na Kit
David Hartinger:16.6.2012 16:27

To není MS, ale návrhem jazyka, Java bude mít to samé, protože nevíš, kdy se destruktor zavolá kvůli povaze GC.

Odpovedať
16.6.2012 16:27
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovedá na David Hartinger
Kit:16.6.2012 16:30

Ano. Garbage Collector se obvykle spouští až když nedostačuje přidělená paměť. Je to časově náročná činnost a její vykonávání po každé likvidaci nějaké datové struktury by bylo neefektivní.

Proto také není možné destruktor přetížit. Vznikl by chaos.

Odpovedať
16.6.2012 16:30
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovedá na David Hartinger
Kit:16.6.2012 16:36

Destruktor by se měl zavolat pokaždé, když počet odkazů na objekt klesne na nulu. Fyzicky pak mrtvý objekt v paměti zůstane do té doby, než ho GC zamete.

Je to stejné i u souborového systému. Pokud smažu všechny názvy souboru a zavřu ho ze všech aplikací, teprve pak je fyzicky smazán. Ale jen tak, že se obsazené sektory označí za neplatné. Jako Garbage Collector by se pak dala označit defragmentace.

Odpovedať
16.6.2012 16:36
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovedá na David Hartinger
Kit:16.6.2012 17:22

Tak jsem našel další článek
http://www.codeproject.com/…ructors-in-C
a konečně mi došlo, v čem přesně dělá MS chybu. Nevede si u objektů seznam zpětných odkazů.

Podobnou chybu má i v souborových systémech, způsobuje nemožnost smazání otevřeného souboru.

Odpovedať
16.6.2012 17:22
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na Kit
David Hartinger:16.6.2012 17:49

Teď nevím, jak to myslíš.

Odpovedať
16.6.2012 17:49
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovedá na David Hartinger
Kit:16.6.2012 18:09

Souvisí to s vnitřní strukturou, kterou programátor nevidí. Dříve byl heap jen jednosměrně vázaným seznamem volných či obsazených bloků. S příchodem objektů to už však nestačí, neboť na jeden objekt může vést víc odkazů. Prostor, který objekt zabírá, můžeme fyzicky uvolnit až se zrušením všech odkazů. Ovšem ještě před uvolněním je nutné zavolat destruktor. MS to sloučil do jedné funkce, kterou svěřil Garbage Collectoru. A to je chybně, protože to neodpovídá návrhu OOP.

Destruktor se musí zavolat ihned po zániku všech odkazů na objekt. Objekt pak zůstane v paměti ve stavu mrtvý a čeká, až ho GC zamete.

GC by měl být z pohledu aplikace neviditelný a jeho činnost nedetekovatelná. Pokud teprve při úklidu spouští destruktory, může to mít vliv na aplikaci.

Odpovedať
16.6.2012 18:09
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!