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.

Člen

Zobrazeno 10 zpráv z 10.
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.