คำว่าทรัพยากรที่มีการจัดการและทรัพยากรที่ไม่มีการจัดการใน. NET หมายถึงอะไร เข้ามาในภาพได้อย่างไร?
คำว่าทรัพยากรที่มีการจัดการและทรัพยากรที่ไม่มีการจัดการใน. NET หมายถึงอะไร เข้ามาในภาพได้อย่างไร?
คำตอบ:
คำว่า "ทรัพยากรที่ไม่มีการจัดการ" มักใช้เพื่ออธิบายบางสิ่งที่ไม่ได้อยู่ภายใต้การควบคุมของผู้รวบรวมขยะโดยตรง ตัวอย่างเช่นหากคุณเปิดการเชื่อมต่อกับเซิร์ฟเวอร์ฐานข้อมูลสิ่งนี้จะใช้ทรัพยากรบนเซิร์ฟเวอร์ (สำหรับการรักษาการเชื่อมต่อ) และอาจเป็นทรัพยากรอื่น ๆ ที่ไม่ใช่เครือข่ายบนเครื่องไคลเอนต์หากผู้ให้บริการไม่ได้เขียนโค้ดที่มีการจัดการทั้งหมด
ด้วยเหตุนี้สำหรับบางอย่างเช่นการเชื่อมต่อฐานข้อมูลขอแนะนำให้คุณเขียนโค้ดของคุณด้วยเหตุนี้:
using (var connection = new SqlConnection("connection_string_here"))
{
// Code to use connection here
}
เพื่อให้แน่ใจว่า.Dispose()
ถูกเรียกบนอ็อบเจ็กต์การเชื่อมต่อทำให้มั่นใจว่ารีซอร์สที่ไม่มีการจัดการจะถูกล้าง
ทรัพยากรที่มีการจัดการคือทรัพยากรที่เป็นรหัส. NET ที่บริสุทธิ์และจัดการโดยรันไทม์และอยู่ภายใต้การควบคุมโดยตรง
ทรัพยากรที่ไม่มีการจัดการคือทรัพยากรที่ไม่มี จัดการไฟล์หน่วยความจำที่ตรึงวัตถุ COM การเชื่อมต่อฐานข้อมูลเป็นต้น
ในคำถามและคำตอบทรัพยากรที่ไม่มีการจัดการคืออะไร 1 , Bruce Woodโพสต์สิ่งต่อไปนี้:
ฉันนึกถึงคำว่า "จัดการ" และ "ไม่มีการจัดการ" ในลักษณะนี้:
"Managed"หมายถึงอะไรก็ได้ภายใน. NET แซนด์บ็อกซ์ ซึ่งรวมถึงคลาส. NET Framework ทั้งหมด
"ไม่มีการจัดการ"หมายถึงถิ่นทุรกันดารนอกแซนด์บ็อกซ์. NET ซึ่งรวมถึงสิ่งที่ส่งคืนให้คุณผ่านการเรียกใช้ฟังก์ชัน Win32 API
หากคุณไม่เคยเรียกใช้ฟังก์ชัน Win32 API และไม่ได้รับออบเจ็กต์ "handle" ของ Win32 กลับมาแสดงว่าคุณไม่ได้ถือทรัพยากรที่ไม่มีการจัดการใด ๆ ไฟล์และสตรีมที่คุณเปิดผ่านเมธอดคลาส. NET Framework คือ Wrapper ที่มีการจัดการทั้งหมด
หมายเหตุ:คุณอาจไม่ได้ถือเป็นทรัพยากรที่ไม่มีการจัดการโดยตรง แต่คุณอาจจะถือเป็นทรัพยากรที่ไม่มีการจัดการทางอ้อมผ่านการจัดการ "เสื้อคลุมคลาส" เช่นSystem.IO.FileStream คลาส Wrapper ดังกล่าวมักจะใช้IDisposable (ไม่ว่าโดยตรงหรือโดยการสืบทอด)
... อ็อบเจ็กต์ที่มีการจัดการ (.NET Framework) จำนวนมากกำลังถือทรัพยากรที่ไม่มีการจัดการไว้ภายในและคุณอาจต้องการกำจัด () ของพวกมันโดยเร็วที่สุดหรืออย่างน้อยก็ให้โอกาสผู้โทรของคุณในการทำเช่นนั้น นั่นคือสิ่งที่เขียนเมธอด Dispose () ของคุณเองโดยพื้นฐานแล้วการใช้ IDisposable () จะทำสองสิ่งให้คุณ:
ช่วยให้คุณสามารถกำจัดทรัพยากรใด ๆ ที่คุณได้รับโดยตรงจากระบบปฏิบัติการที่อยู่ด้านหลังของ. NET (ทรัพยากรที่ไม่มีการจัดการ)
ช่วยให้คุณและโทรติดต่อของคุณจะปล่อยวัตถุหนัก .NET / วัตถุ NET ที่มีการถือครองทรัพยากรอันมีค่าในมือน้อยของพวกเขาสกปรกที่คุณ / โทรติดต่อของคุณต้องการการปล่อยตัวออกมาในขณะนี้
หมายเหตุ:โดยการดำเนินการIDisposable
และจึงให้Dispose()
วิธีการที่คุณจะช่วยให้ผู้ใช้ของชั้นเรียนของคุณที่จะปล่อยในกำหนดแฟชั่นทรัพยากรที่ไม่มีการจัดการใด ๆ ที่จัดโดยอินสแตนซ์ของคลาส
1การเชื่อมโยงร่วมกันครั้งแรกในคำตอบของชิน Shanbhag อ้างถึงเนื้อหาในวันที่ 2005-11-17 โปรดทราบว่าฉันได้คัดลอกเนื้อหาที่ยกมาเล็กน้อย
ความแตกต่างพื้นฐานระหว่างทรัพยากรที่มีการจัดการและไม่มีการจัดการคือตัวรวบรวมขยะรู้เกี่ยวกับทรัพยากรที่มีการจัดการทั้งหมดในบางช่วงเวลา GC จะเข้ามาและล้างหน่วยความจำและทรัพยากรทั้งหมดที่เกี่ยวข้องกับอ็อบเจ็กต์ที่ถูกจัดการ GC ไม่รู้เกี่ยวกับทรัพยากรที่ไม่มีการจัดการเช่นไฟล์สตรีมและแฮนเดิลดังนั้นหากคุณไม่ล้างข้อมูลเหล่านี้อย่างชัดเจนในโค้ดของคุณคุณจะพบกับหน่วยความจำรั่วและทรัพยากรที่ถูกล็อก
สำหรับรายละเอียดเพิ่มเติม - http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources
รีซอร์สที่มีการจัดการคือรีซอร์สที่ตัวรวบรวมขยะสามารถทำให้เป็นอิสระได้และรีซอร์สที่ไม่มีการจัดการไม่สามารถปลดปล่อยโดยตัวรวบรวมขยะสำหรับตัวทำลายวัตถุประสงค์นี้