處置(dispose)和定稿(finalize)的區別

在程式語言中,物件在存在期間只能有變數,例項化後不能修改。因此不能將同一個記憶體單元分配給新值,因此需要某種自動記憶體管理來管理未使用的空間。這些未使用的空間稱為垃圾,有效記憶體管理的整個過程稱為垃圾收集。...

在程式語言中,物件在存在期間只能有變數,例項化後不能修改。因此不能將同一個記憶體單元分配給新值,因此需要某種自動記憶體管理來管理未使用的空間。這些未使用的空間稱為垃圾,有效記憶體管理的整個過程稱為垃圾收集。

垃圾收集器的主要目標是將死的物件與活的物件分開,並回收空間以供重用。基本上,整個過程都是在託管堆上進行的,託管堆只不過是一個記憶體塊,垃圾收集器會定期檢查堆記憶體以將記憶體分配給新物件。釋放非託管資源(如檔案和資料庫連線)有兩種方法:Dispose和Finalize。

本文有助於您理解兩者之間的區別。

處置(dispose)和定稿(finalize)的區別

什麼是處置方法(a dispose method)?

Dispose是一種標準的方法,使用者可以告訴物件釋放資源,不要再次嘗試訪問物件。dispose方法透過使物件不可用來控制顯式記憶體清理。

當使用者呼叫Dispose()方法時,物件應該釋放所有昂貴的資源,從而使其可重用。它從不被垃圾收集器呼叫,垃圾收集器只在託管記憶體不足時才會呼叫。一個名為“IDisposable”的特殊介面用於決定在何處以及如何實現Dispose()。但是當dispose方法沒有被呼叫時會發生什麼呢?

 

處置(dispose)和定稿(finalize)的區別

什麼是定案方法(a finalize method)?

如果沒有呼叫dispose方法,則回退計劃是使用Finalize()方法進行清理。垃圾回收器呼叫它,在釋放記憶體之前執行最終的資源清理。及時清理的概念在這裡變得不適用,因為不是立即取消分配記憶體,而是將物件新增到終結佇列中,然後銷毀。Finalize更像是在發生程式設計錯誤時設定的一種保護措施,而dispose不會清理資源,在這種情況下,垃圾收集器將呼叫Finalize()方法以按其喜歡的順序刪除無法訪問的物件。

 

dispose和finalize之間的區別

dispose和finalize的基礎知識

呼叫Dispose方法可加快非託管資源(如資料庫控制代碼、檔案控制代碼、訊號量和作業系統分配的其他物件)的釋放。dispose方法被呼叫來執行清除未使用的記憶體和稀缺資源(如GDI控制代碼)所需的程式碼。簡單地說,dispose方法提供了顯式記憶體清理的控制。另一方面,Finalize方法是垃圾收集的一部分,用於在物件被垃圾收集之前對其執行最終清理操作。簡單地說,finalize方法被呼叫以在物件被銷毀之前釋放物件所持有的非託管資源。

呼叫dispose和finalize

Dispose方法可以由使用者程式碼和實現該方法以釋放資源的類顯式呼叫。但是,在垃圾收集器執行清理過程之前,無法釋放記憶體。即使物件的其他引用仍然存在,也可以呼叫該方法。相反,finalize方法只能在垃圾回收器確定最後一個記憶體物件例項已銷毀並且不再存在對該物件的引用之後才能被呼叫。finalize方法執行後,物件將從堆記憶體中移除。

實施處置和定案

從記憶體中處理物件的過程稱為dispose模式,該模式可用於訪問非託管資源的物件,因為垃圾收集器無法回收非託管資源。實現“IDisposable”介面以及附加的Dispose(布林)方法,要求釋放非託管資源。finalize方法在物件的例項在釋放之前被銷毀時執行。它是一種不確定的方法,由垃圾收集器自行決定,甚至可能不會發生。除非非常必要,否則不應在託管物件上實現它。

執行處置和定案

使用dispose方法比使用finalize來即時處理物件要快得多。解構函式在執行時自動轉換為finalize方法。當物件超出作用域時,垃圾收集器會自動呼叫它,這通常發生在該物件的例項被銷毀時。finalize方法的問題是它是不確定的,這意味著它不確定何時回收不再透過垃圾收集引用的記憶體。但是,它可能不會立即釋放記憶體;事實上,它可能永遠不會被呼叫,也不能被顯式地強制。

處置與最終確定:比較圖

處置(dispose)和定稿(finalize)的區別

 

總結 - 處理(of dispose) vs. 定稿(finalize)

dispose和finalize方法的主要區別在於前者是一種確定性方法,當物件不再使用時,它會立即對其進行處理,後者是一種分配非託管資源的非確定性方法,這意味著它是一種在記憶體物件例項在釋放前超出作用域時釋放記憶體物件例項的後備方法。除非非常必要,否則最好在finalize上使用dispose方法。

換句話說,finalize是一種保護措施,用於在發生程式設計錯誤時無法呼叫dispose方法時清理非託管資源。Finalize方法在物件即將從堆記憶體中踢出時由垃圾收集器呼叫。

  • 發表於 2021-06-25 14:55
  • 閱讀 ( 40 )
  • 分類:科技

你可能感興趣的文章

處置()(dispose ())和完成()(finalize ())的區別

...較-以表格形式顯示dispose()與finalize() 6. 摘要 什麼是處置()(dispose())? NET framework最重要的優點之一是它提供自動垃圾回收。它會自動釋放未使用物件的記憶體。在C語言和C++語言中,程式設計師必須自己處理記憶體管理。...

  • 發佈於 2020-10-18 23:21
  • 閲讀 ( 55 )

靜止的(static)和java期末考試(final in java)的區別

...final是Java中的兩個關鍵字。本文討論Java中static和final之間的區別。Java中static和final之間的關鍵區別在於static用於定義可以獨立於類的任何物件使用的類成員,而final用於宣告常量變數或無法重寫的方法或無法繼承的類。 目錄 1. ...

  • 發佈於 2020-10-19 07:48
  • 閲讀 ( 53 )

最終決賽(final finally)和用java完成(finalize in java)的區別

...以確保方法的功能永遠不會被更改。 圖01:最終、最終和定稿 也可以對類使用final關鍵字。新類不能繼承final類的變數和方法。這有助於提高安全性。由於類被子類阻止使用,所以資料受到保護。 什麼是最後是java(finally in java)?...

  • 發佈於 2020-10-19 15:24
  • 閲讀 ( 52 )

個人收入(personal income)和個人可支配收入(personal disposable income)的區別

個人收入(personal income)和個人可支配收入(personal disposable income)的區別 個人收入和個人可支配收入是兩個應該準確區分的術語,因為它們是可以互換使用的,儘管它們之間存在差異。個人收入與個人可支配收入的主要區別在於...

  • 發佈於 2020-10-24 14:50
  • 閲讀 ( 75 )

國民收入(national income)和可支配收入(disposable income)的區別

國民收入(national income)和可支配收入(disposable income)的區別 國民收入和可支配收入是衡量經濟繁榮程度的兩個重要經濟指標。國民收入和可支配收入之間的主要區別在於,國民收入是一個國家一年內生產的所有商品和服務的總...

  • 發佈於 2020-10-25 04:15
  • 閲讀 ( 93 )

可任意處理的(disposable)和可自由支配收入(discretionary income)的區別

可任意處理的(disposable)和可自由支配收入(discretionary income)的區別 可支配收入和可支配收入是衡量消費支出的兩種經濟指標。這兩項指標都是重要的經濟指標,可以用來顯示經濟的強勁性。可支配收入和可支配收入除了細微差...

  • 發佈於 2020-10-25 04:41
  • 閲讀 ( 83 )

最終的(final)和結局(finale)的區別

...是這兩個詞的主要區別。透過本文讓我們進一步考察兩者的區別。 什麼是最終的(final)? 決賽是指錦標賽的最後一場比賽,決定總冠軍。在許多運動專案中,如網球賽、橄欖球、籃球,結束比賽的比賽被稱為最後一場比賽。這裡...

  • 發佈於 2020-10-25 08:32
  • 閲讀 ( 34 )

折舊(depreciation)和折舊準備(provision for depreciation)的區別

...美元的殘值只是一個估計值;在經濟壽命結束時該資產可處置的實際價值可能與殘值不同),則會計分錄如下:, 現金A/C Dr 20000美元 累計折舊A/C Dr$40000 處置收益Cr$10000 機器A/C Cr 50000美元 折舊(depreciation)和折舊準備(provision for de...

  • 發佈於 2020-10-25 12:55
  • 閲讀 ( 93 )

會計折舊(accounting depreciation)和稅收折舊(tax depreciation)的區別

...則該年度不收取折舊費 全年折舊將在購買當年收取 資產處置年度不收取折舊費 處置固定有形資產 在經濟使用壽命結束時,資產可按貨幣價值進行處置。公司將在處置時產生收益或虧損,並在損益表中確認。 會計折舊(accounting...

  • 發佈於 2020-10-25 14:39
  • 閲讀 ( 124 )

實現(realized)和未實現收益(unrealized gains)的區別

...(20000美元的成本減去7800美元的累計折舊)為12200美元。處置收益計算如下。 圖1:實現收益計算 1800美元轉入損益表“營業外收益\其他收入”部分。 什麼是未實現收益(unrealized gains)? 未實現收益是指已在賬面上發生但尚未完成...

  • 發佈於 2020-10-25 19:26
  • 閲讀 ( 58 )
苦咖啡喝多了
苦咖啡喝多了

0 篇文章

作家榜

  1. admin 0 文章
  2. 孫小欽 0 文章
  3. JVhby0 0 文章
  4. fvpvzrr 0 文章
  5. 0sus8kksc 0 文章
  6. zsfn1903 0 文章
  7. w91395898 0 文章
  8. SuperQueen123 0 文章

相關推薦