Diskuze: Jednoduchý dotaz na dispose
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 10 zpráv z 10.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


IDisposable implementuješ na tých objektoch, ktoré spravujú tzv. unmanaged resources (najčastejšie to sú spojenia k súborom, prípadne ak z aplikácie spúšťaš unmanaged (non-.net) kód).
GC.SuppressFinalize by si v 99.9999999999% pripadov nemal mať dôvod volať a už vôbec ho nemáš čo používať v Dispose. Keď už, tak sa táto metóda volá v deštruktore ( ~MenoTriedy() { } ), nie v Dispose.
https://docs.microsoft.com/…ting-dispose
https://docs.microsoft.com/…/destructors
Dobře díky za vysvětlení. No a to je tedy jedno, že si vytvořím objekt a pak zůstane prostě v paměti? Nebo ho mám dát do DI?
GC sám uvoľnuje objekty v pamäti, na ktoré už nič neodkazuje.
Neuvoľňuje jedine vyššie spomínané unmanaged resources. Musel by si mať
veľmi, veľmi fucked up memory management, aby si GC nevedel robiť svoju
prácu
Tam už je ale
problém inde a implementovaním IDisposable ho nevyriešiš.
Btw, garbage collection a IDisposable nefungujú od seba oddelene, je chybou na to takto pozerať. V Dispose uvoľníš práve tie unmanaged resources, ktoré tvoj objekt spravuje, ale objekt samotný musí aj tak odpratať GC.
Jo aha to jsem neveděl
Tak super děkuju moc fakt zajímavý! Tak děkuju moc jsem rád, že konečně
vím jak to funguje. 
Ještě jeden rychlý dotaz. Nemám si to tedy dát do toho DI? Já v tom prostě nevidím žádnou velkou výhodu, až na to že komunikuji vlastně s rozhraním a ne se třídou což je fajn, ale jinak nevím.... Předem diky za objasnění
To by si mal vedieť sám. Ja tvoj projekt nepoznám, takže do veľkej miery si budem teraz cucať z prsta. Ale áno, objekt pre prácu s emailom znie ako niečo, čo chceš naprieč aplikáciou zdieľať cez DI.
Veď ty počkaj až budeš niekedy ten systém upravovať alebo naňho
písať testy, bleskovo zistíš, načo ti tie rozhrania sú 
A můžu nějak použít v DI objekt s kontruktorem? Nebo to musím udělat přes vlastnosti?
Mal by si sa vyhýbať tomu, aby tvoje objekty určené pre DI mali parametrizované konštruktory (ak správne chápem tvoj problém, tak ťa trápi, či môže mať tvoj objekt konštruktor s parametrami. Bezparametrický konštruktor zavolá DI bez problémov).
Záleží aj na DI frameworku, ktorý používaš. Je pomerne bežné, že ak
máš v konštruktore parametre takých typov, ktoré sú v DI tiež
registrované, tak kontajner ich tam je schopný dosadiť.
Napr. ak máš objekt ChciVytvorit s konštruktorom ChciVytvorit(IMujService
mujService), pričom pod IMujService si do kontajnera niečo zaregistroval, tak
by to nemal byť problém. Opakujem ale, overiť, či to tvoj používaný
framework podporuje. Viem, že defaultná DI v ASP.NET Core to podporuje
určite.
Je však zle, ak máš napr. konštruktor ChciVytvorit(float hodnota). Alebo ak tam máš akýkoľvek iný typ, ktorý v DI registrovaný nie je, príp. sa do DI kontajneru ani registrovať nedá. V takomto prípade máš dve možnosti:
Ak ti tieto možnosti nevyhovujú, tak tú inicializáciu musíš dokončiť nejako dodatočne. Napr. cez nejakú metódu ChciVytvorit.Nacti(float hodnota), alebo cez public settery.
P.S.: Pre takéto rozširujúce otázky mimo pôvodnej témy založ radšej nové vlákno. Bude to potom ľahšie dohľadateľné pre iných ľudí s podobným problémom.
Zobrazeno 10 zpráv z 10.