NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 1 - Výjimky

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
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ě.

Odpovědět
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
Odpovídá 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é :)

Odpovědět
16.6.2012 16:13
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá 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.

Odpovědět
16.6.2012 16:25
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá 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.

Odpovědět
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
Odpovídá 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.

Odpovědět
16.6.2012 16:27
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá 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.

Odpovědět
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
Odpovídá 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.

Odpovědět
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
Odpovídá 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.

Odpovědět
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
Odpovídá na Kit
David Hartinger:16.6.2012 17:49

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

Odpovědět
16.6.2012 17:49
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá 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.

Odpovědět
16.6.2012 18:09
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 27.