ตัวอย่างเช่น:
public class Person
{
public Person()
{
}
~Person()
{
}
}
เมื่อใดที่ฉันควรสร้าง destructor ด้วยตนเอง คุณต้องการสร้าง destructor เมื่อใด
ตัวอย่างเช่น:
public class Person
{
public Person()
{
}
~Person()
{
}
}
เมื่อใดที่ฉันควรสร้าง destructor ด้วยตนเอง คุณต้องการสร้าง destructor เมื่อใด
คำตอบ:
UPDATE: คำถามนี้เป็นเรื่องของการบล็อกของฉันในเดือนพฤษภาคมปี 2015 ขอบคุณสำหรับคำถามที่ยอดเยี่ยม! ดูบล็อกเพื่อดูรายการเท็จที่คนทั่วไปเชื่อว่าเกี่ยวกับการสรุป
เมื่อใดที่ฉันควรสร้าง destructor ด้วยตนเอง
แทบจะไม่เคย.
โดยทั่วไปแล้วเพียงหนึ่งสร้าง destructor เมื่อคลาสของคุณมีทรัพยากรที่มีการจัดการที่มีราคาแพงบางอย่างที่ต้องล้างข้อมูลเมื่อวัตถุหายไป มันจะดีกว่าที่จะใช้รูปแบบที่ใช้แล้วทิ้งเพื่อให้แน่ใจว่าทรัพยากรที่มีการทำความสะอาด destructor นั้นเป็นการรับประกันว่าหากผู้บริโภคของวัตถุของคุณลืมที่จะกำจัดมันทรัพยากรก็ยังคงถูกกำจัดในที่สุด (อาจจะ.)
ถ้าคุณทำ destructor ต้องระมัดระวังอย่างมากและเข้าใจวิธีการเก็บขยะทำงาน Destructors แปลกจริง ๆ :
เกือบจะไม่มีอะไรที่เป็นความจริงตามปกติเป็นความจริงในผู้ทำลายล้าง ระวังตัวด้วยจริงๆ การเขียน destructor ที่ถูกต้องนั้นยากมาก
คุณต้องการสร้าง destructor เมื่อใด
เมื่อทำการทดสอบส่วนหนึ่งของคอมไพเลอร์ที่จัดการกับ destructors ฉันไม่เคยต้องการที่จะทำในรหัสการผลิต ฉันไม่ค่อยเขียนวัตถุที่จัดการทรัพยากรที่ไม่มีการจัดการ
มันเรียกว่า "finalizer" และโดยปกติคุณควรสร้างขึ้นมาสำหรับคลาสที่สถานะ (เช่น: ฟิลด์) รวมถึงทรัพยากรที่ไม่มีการจัดการ (เช่น: ตัวชี้เพื่อจัดการดึงข้อมูลผ่านการโทรแบบ p / เรียกใช้) อย่างไรก็ตามใน NET 2.0 และหลังจากนั้นมีจริงเป็นวิธีที่ดีกว่าที่จะจัดการกับการทำความสะอาดขึ้นของทรัพยากรที่ไม่มีการจัดการ: SafeHandle เมื่อพิจารณาถึงสิ่งนี้คุณไม่จำเป็นต้องเขียน finalizer อีกเลย
คุณไม่จำเป็นต้องใช้เว้นแต่ชั้นเรียนของคุณจะรักษาทรัพยากรที่ไม่มีการจัดการเช่นการจัดการไฟล์ Windows
มันเรียกว่า destructor / finalizer และมักจะสร้างขึ้นเมื่อใช้รูปแบบการจำหน่าย
เป็นโซลูชันสำรองเมื่อผู้ใช้ในชั้นเรียนของคุณลืมเรียกใช้ Dispose เพื่อให้แน่ใจว่า (ในที่สุด) ทรัพยากรของคุณได้รับการปล่อยตัวออกมา แต่คุณไม่มีการรับประกันใด ๆ เมื่อเรียกว่า destructor
ในคำถาม Stack Overflowคำตอบที่ยอมรับอย่างถูกต้องจะแสดงวิธีการใช้รูปแบบการกำจัด นี่เป็นสิ่งจำเป็นเฉพาะในกรณีที่คลาสของคุณมีทรัพยากรที่ไม่ได้จัดการใด ๆ ที่ตัวรวบรวมข้อมูลขยะไม่ได้จัดการเพื่อล้างข้อมูลตัวเอง
แนวปฏิบัติที่ดีคือการไม่ใช้ตัวเลือกสุดท้ายโดยไม่ต้องให้ผู้ใช้ในชั้นเรียนมีความเป็นไปได้ในการกำจัดออบเจ็กต์ด้วยตนเองเพื่อปลดปล่อยทรัพยากรทันที
เมื่อคุณมีทรัพยากรที่ไม่มีการจัดการและคุณต้องทำให้แน่ใจว่าพวกเขาจะถูกล้างข้อมูลเมื่อวัตถุของคุณหายไป ตัวอย่างที่ดีคือวัตถุ COM หรือตัวจัดการไฟล์
ฉันใช้ destructor (เพื่อจุดประสงค์ในการดีบักเท่านั้น) เพื่อดูว่าวัตถุนั้นถูกลบออกจากหน่วยความจำในขอบเขตของแอปพลิเคชัน WPF หรือไม่ ฉันไม่แน่ใจว่าการรวบรวมขยะกำลังกำจัดวัตถุจากหน่วยความจำอย่างแท้จริงและนี่เป็นวิธีที่ดีในการตรวจสอบ
Destructors จัดเตรียมวิธีการในการปลดปล่อยทรัพยากรที่ไม่ได้รับการจัดการที่ถูกห่อหุ้มในคลาสของคุณพวกมันจะถูกเรียกเมื่อ GC เข้าใกล้มันและพวกเขาเรียกวิธีการ Finalize ของคลาสพื้นฐานโดยปริยาย หากคุณใช้ทรัพยากรที่ไม่มีการจัดการจำนวนมากจะเป็นการดีกว่าที่จะให้วิธีการที่ชัดเจนในการปลดปล่อยทรัพยากรเหล่านั้นผ่านอินเทอร์เฟซ IDisposable ดูคู่มือการเขียนโปรแกรม C #: http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx