Jaký je rozdíl mezi konstruktorem a destruktorem v C #?


Odpověď 1:

C # nemá destruktory, má finalizátory, což je jiné.

Konstruktor je v podstatě to, co se nazývá klíčové slovo „nové“, a v jazycích, které je mají, se destruktory nazývají klíčovým slovem „odstranit“ (nebo když objekt přesahuje rozsah).

Na druhé straně finalizátor je nazýván sběratelem odpadků, někdy po tom, co objekt zhasne, nebo rozsah (technicky, když na něj již nejsou žádné ukazatele, které také nejsou „mimo rozsah“).

Dvě důležité poznámky k finalizátorům:

  • Nemůžete přesně vědět, kdy to bude nazýváno. Musíte si dávat pozor na to, co děláte ve finalizátoru - ostatní objekty ve stejné třídě mohou být již sebrány. Ve finalizátoru byste se měli dotýkat pouze nespravovaných referencí.

Pokud chcete / potřebujete něco blíže k destruktoru v C #, máte rozhraní IDisposable, které poskytuje metodu; „Zlikvidujte“.

C # má speciální klíčové slovo „using“, které deklaruje objekt v rozsahu a zaručuje, že je volána metoda Dispose.

Tato metoda by měla také zlikvidovat všechny objekty IDisposable, které vlastní implicitující třída.

Pokud vaše třída obsahuje nespravované objekty, měli byste vytvořit přetížení metody Dispose, která vezme booleovský parametr. Tato metoda by měla zlikvidovat všechny nezměněné odkazy a pokud je parametr bool pravdivý, měla by také zlikvidovat všechny IDisposable objekty. Pak byste měli vytvořit finalizátor, který volá Dispose (false), aby se zajistilo, že nespravované prostředky budou uvolněny v případě, že metoda disposing nebyla nikdy vyvolána. Pravidelné Dispose by mělo volat Dispose (true) a také volání GC.SurpressFinalize (), protože finalizace nebude nutná (to zajistí, že objekt bude rychlejší shromažďování odpadu a pomáhá předcházet chybám ve finalizátoru)


Odpověď 2:

Konstruktor a destruktor jsou speciální členské funkce třídy ve všech programovacích jazycích, jako je c # nebo Java. Funkce členů tezí mají jméno stejné jako jméno třídy a jsou vyvolány, když vytváříme objekt třídy.

V zásadě se konstruktor používá k inicializaci datových členů třídy a destruktor se používá ke zničení objektů nebo k uvolnění vzpomínek obsazených objektem.

Jedno použití konstruktoru v reálném čase je inicializace datových členů s výchozími hodnotami, a proto máme výchozí konstruktor.

Například kdykoli vytváříme e-maily z jakékoli domény, jako je Gmail, Yahoo nebo Microsoft, dostaneme do naší doručené pošty nějaké výchozí e-maily, což znamená, že tyto e-maily jsou výchozí hodnoty.

Abychom to lépe pochopili, považujte Gmail za třídu.

třída Gmail
{
 řetězcová zpráva;
 veřejný Gmail (řetězec Uživatelské jméno)
 {
   message = „vítejte v Gmailu“ + uživatelské jméno
 }
}
V hlavní funkci
Gmail g1 = nový Gmail („Shinchan.gupta“);
Gmail g2 = nový Gmail („aching.gupta“);

Nyní, kdykoli vytvoříme nové e-mailové ID, znamená to, že vytváříme nový objekt Gmailu. A inicializuje členy dat zpráv se standardními hodnotami pro všechny objekty, a proto dostane každý uživatel gmailu do doručené pošty stejnou zprávu, což je výchozí pošta, kterou můžete říci.

Nyní jsme vytvořili dva objekty a obsahuje alokaci paměti, která by měla být uvolněna, jakmile bude program spuštěn, a proto máme destruktor, který se také nazývá automaticky a ničí objekty, aby se uvolnila paměť.

Jednoduše řečeno, když použijete konstruktor, přidělí paměť a když použijete destruktor, uvolní přidělenou paměť.