64. finalize Method

[נכתב ע”י מתן אופנהיים]

בהמשך לשבוע שחרור משאבים (Dispose ושות’),

לפעמים אנחנו לא רוצים לנהל שחרור משאבים unmanaged בעצמנו, ולחשוב על הזמן הנכון של קריאה לdispose.

בנוסף, יכול להיות שהאובייקט שלנו ינוקה על ידי הGC, לפני שמתודת Dispose נקראה!

קיים מנגנון מתוחכם ומורכב של שחרור משאבים כאלו , שנקרא Finalization, שפותר לנו את הבעיות הללו.

באופן כללי, המתכנת מממש פונקצית Finalize בעצמו (הsyntax יפורט בהמשך), שאחראית על שחרור משאבים כלשהם (לרוב unmanaged).

הפונקציה נקראת כשהGC מחליט שהאובייקט לא נגיש יותר, ומהווה תנאי מקדים לניקוי הסופי של האובייקט.

מנגנון הGC מנהל thread שאחראי על קריאה לכל פונקציות הFinalize של אובייקטים שנחשבים ללא נגישים.

הבהרות :

Syntax:

1
2
3
4
5
6
7
class Car
{
~Car() // Destructor
{
// Cleanup statements...
}
}

בפועל , הפונקציה ~Car() מתורגמת לקוד הבא:

1
2
3
4
5
6
7
8
9
10
11
protected override void Finalize()
{
try
{
// Cleanup statements...
}
finally
{
base.Finalize();
}
}

הערה: מומלץ לממש Finalizer רק במידת הצורך מאחר ומימוש Finalizer מגדיל משמעותית את הזמן שיקח לאובייקט להאסף ע"י הGC.

יום לא גשום טוב

שתף