В езиците за програмиране един обект може да има променлива само по време на съществуването си, след като инстанцията не може да бъде променен. Така една и съща клетка памет не може да бъде разпределена на нови стойности, следователно е необходимо някакво автоматизирано управление на паметта, за да се управляват неизползваните пространства. Тези неизползвани пространства се наричат боклук и целият процес на ефективно управление на паметта се нарича събиране на боклука.
Основната цел на боклука е да отдели мъртвите предмети от живите обекти и да възстанови пространството за повторна употреба. По принцип цялата работа работи на управлявана грамада, която не е нищо друго освен блок памет, а колекторът за боклук периодично проверява паметта на купчината, за да разпределя памет на нови обекти. Има два метода за освобождаване на неуправляеми ресурси като файлове и връзки към базата данни: Разположете и финализирайте.
Тази статия ви помага да разберете разликата между двете.
Dispose е стандартен начин потребителите да кажат на обектите да освободят ресурсите си и да не се опитват да получат достъп до обектите отново. Методът за изхвърляне осигурява контрол на изричното почистване на паметта, като прави обектите неизползваеми.
Когато потребителите извикат метода Dispose (), обектът трябва да освободи всички свои скъпи ресурси, като по този начин го направи достъпен за повторна употреба. Той никога не се извиква от боклука, който влиза в игра само когато управляваната памет стане оскъдна. Използва се специален интерфейс, наречен „IDisposable“, за да се реши къде и как да се приложи Dispose (). Но какво се случва, когато методът за изхвърляне не се обажда?
Ако методът на изхвърляне не се извиква, резервният план е да се използва методът Finalize () за почистване. Той се обажда от събирача за боклук, за да извърши окончателно почистване на ресурсите, преди да освободи паметта. Концепцията за своевременно почистване става неприложима тук, тъй като вместо да се раздели паметта веднага, обектът се добавя към опашката за финализиране, за да бъде унищожен по-късно. Finalize е по-скоро като защитна мярка, поставена в случай на грешка в програмирането и изхвърлянето не почиства ресурсите, в този случай методът Finalize () се извиква от събирача за боклук, за да премахне недостъпни обекти в каквато и да е последователност.
Методът за разпореждане се призовава да ускори освобождаването на неуправляеми ресурси, като дръжки на базата данни, дръжки на файлове, семафори и други обекти, разпределени от операционната система. Методът за изхвърляне се използва за изпълнение на код, необходим за почистване на неизползвана памет и оскъдни ресурси, като GDI дръжки. Най-просто казано, методът на изхвърляне осигурява контрол на изричното почистване на паметта. Методът на финализиране, от друга страна, е част от събирането на боклука, използвана за извършване на последна операция за почистване на обект, преди да се събира боклук. Просто казано, методът за финализиране се призовава да освободи неуправляеми ресурси, притежавани от обект, преди той да бъде унищожен.
Методът на разположение може да бъде извикан изрично от потребителския код и класа, който реализира метода за разпореждане с ресурси. Обаче паметта не може да бъде освободена, докато боклукът не извърши процеса на почистване. Методът може да бъде извикан, дори ако други препратки към обекта все още съществуват. Методът на финализиране, напротив, може да бъде извикан от колектора за боклук само след като определи, че последният екземпляр на обект памет е унищожен и няма повече препратки към обекта. След като се изпълни методът за финализиране, обектът се изважда от паметта на купчината.
Процесът на изхвърляне на обект от паметта се нарича модел на разпореждане, който може да се използва за обекти, които имат достъп до неуправляеми ресурси, тъй като боклукърът не е в състояние да възстанови неуправляемите ресурси. Интерфейсът „IDisposable“ заедно с допълнителен метод на Dispose (Boolean) се реализира с искане за освобождаване на неуправляеми ресурси. Методът за финализиране се изпълнява, когато инстанцията на обект е унищожена преди разместването му. Това е недетерминиран метод, който възниква по преценка на сметосъбиращия и може дори да не се появи. Той не трябва да се прилага върху управлявани обекти, докато е крайно необходимо.
Много по-бързо е да използвате метод за изхвърляне, а не финализиране за моментално изхвърляне на обекти. Разрушителите автоматично се преобразуват за финализиране на метода по време на изпълнение. Той автоматично се извиква от колектора за боклук, когато обектът излезе извън обхвата, което обикновено се случва, когато инстанцията на този обект бъде унищожена. Проблемът с метода за финализиране е, че той е недетерминиран, което означава, че не е сигурно кога да се възстанови памет, която вече не се препраща чрез събиране на боклука. Въпреки това може да не се освободи паметта веднага; всъщност той никога не може да бъде извикан и не може да бъде принуден изрично.
Основната разлика между методите за разпореждане и финализиране е, че първият е детерминиран метод, който моментално разпорежда обекти, когато те вече не се използват, докато вторият е недетерминиран метод за разпределение на неуправляеми ресурси, което означава, че е метод за спиране за освобождаване случаи на обект от паметта, когато излязат извън обхвата си преди разместването си. Винаги е препоръчително да се използва методът за изхвърляне по време на финализиране, освен ако е крайно необходимо.
С други думи, финализирането е защитна защита, поставена за почистване на неуправляеми ресурси, когато методът на изхвърляне не може да бъде извикан в случай на някаква програмна грешка. Методът за финализиране се извиква от колектора за събиране на боклук, когато обект е на път да бъде изхвърлен от паметта на купчината.