ฉันกำลังดูรหัสและมีคำสั่งนี้:
~ConnectionManager()
{
Dispose(false);
}
คลาสใช้IDisposable
อินเทอร์เฟซ แต่ฉันไม่ทราบว่าเป็นส่วนหนึ่งของที่ตัวหนอน (~) ใช้
ฉันกำลังดูรหัสและมีคำสั่งนี้:
~ConnectionManager()
{
Dispose(false);
}
คลาสใช้IDisposable
อินเทอร์เฟซ แต่ฉันไม่ทราบว่าเป็นส่วนหนึ่งของที่ตัวหนอน (~) ใช้
คำตอบ:
~ เป็นตัวทำลาย
สรุป
ใน C # นั้นวิธีการ Finalize จะทำการดำเนินการที่ destructor C ++ มาตรฐานจะทำ ใน C # คุณไม่ได้ตั้งชื่อ Finalize - คุณใช้ไวยากรณ์ C + destructor ของการวางสัญลักษณ์ tilde (~) หน้าชื่อของคลาส
ทิ้ง
เป็นที่นิยมในการกำจัดของวัตถุในClose()
หรือDispose()
วิธีการที่สามารถเรียกได้ว่าชัดเจนโดยผู้ใช้ของชั้น จบการทำงาน (destructor) ถูกเรียกโดย GC
IDisposableอินเตอร์เฟซที่บอกให้โลกรู้ว่าชั้นเรียนของคุณจบลงทรัพยากรที่ต้องจำหน่ายและให้ผู้ใช้ทางที่จะปล่อยพวกเขา หากคุณต้องการใช้งาน finalizer ในชั้นเรียนของคุณเมธอด Dispose ของคุณควรใช้GC.SuppressFinalize()
วิธีการเพื่อให้แน่ใจว่าขั้นตอนสุดท้ายของอินสแตนซ์ของคุณจะถูกระงับ
จะใช้อะไรดี?
มันไม่ถูกกฎหมายที่จะเรียกผู้ทำลายล้างอย่างชัดเจน destructor ของคุณจะถูกเรียกโดยตัวเก็บขยะ หากคุณจัดการกับทรัพยากรที่ไม่มีการจัดการอันมีค่า (เช่นการจัดการไฟล์) ที่คุณต้องการปิดและกำจัดโดยเร็วที่สุดคุณควรใช้อินเทอร์เฟซ IDisposable
Finalize
วิธีการนี้ถูกเรียกซ้ำสำหรับทุกกรณีในห่วงโซ่การสืบทอดซ้ำๆ โปรดทราบว่านั่นไม่ใช่พฤติกรรมเดียวกันที่คุณจะได้รับจากตัวทำลายที่สืบทอดได้
นี่คือfinalizer พูดตามตรงคุณไม่ควรเขียน finalizer บ่อยนัก คุณจะต้องเขียนเพียงอย่างเดียวถ้า:
IntPtr
) และคุณไม่สามารถใช้งานได้SafeHandle
ซึ่งทำให้ง่ายขึ้นIDisposable
ในชั้นเรียนที่ไม่ได้ปิดผนึก (ความชอบของฉันคือการปิดคลาสนอกจากว่าพวกมันถูกออกแบบมาเพื่อสืบทอด) finalizer เป็นส่วนหนึ่งของรูปแบบการกำหนดมาตรฐานในกรณีดังกล่าวมันถูกใช้เพื่อระบุ destructor สำหรับชั้นเรียน
try/finally
บล็อกที่ไม่มีประโยชน์โดยทั่วไปที่ช่วยให้มั่นใจได้ว่าFinalize
วิธีการหลักได้รับการเรียก สิ่งส่วนใหญ่ที่เป็นจริงของ destructors เป็นจริงของ finalizers และในทางกลับกัน แต่คำพูดหมายถึงสิ่งที่แตกต่างกันเล็กน้อย
เช่นเดียวกับ C ++ มันเป็นตัวทำลายล้าง อย่างไรก็ตามใน C # คุณไม่ได้เรียกมันอย่างชัดเจนมันถูกเรียกใช้เมื่อรวบรวมวัตถุ
ดูDestructors (C # Programming Guide) อย่างไรก็ตามโปรดทราบว่าโปรแกรมเมอร์ไม่สามารถควบคุมได้เมื่อมีการเรียกตัว destructor ซึ่งแตกต่างจาก C ++ เนื่องจากจะถูกกำหนดโดยตัวรวบรวมขยะ
~ มักจะหมายถึง deconstructor ซึ่งจะวิ่งไปทางขวาก่อนที่วัตถุจะตาย