ความหมายของทรัพยากร "จัดการ" เทียบกับ "ไม่มีการจัดการ" ใน. NET


110

คำว่าทรัพยากรที่มีการจัดการและทรัพยากรที่ไม่มีการจัดการใน. NET หมายถึงอะไร เข้ามาในภาพได้อย่างไร?


คำตอบ:


80

คำว่า "ทรัพยากรที่ไม่มีการจัดการ" มักใช้เพื่ออธิบายบางสิ่งที่ไม่ได้อยู่ภายใต้การควบคุมของผู้รวบรวมขยะโดยตรง ตัวอย่างเช่นหากคุณเปิดการเชื่อมต่อกับเซิร์ฟเวอร์ฐานข้อมูลสิ่งนี้จะใช้ทรัพยากรบนเซิร์ฟเวอร์ (สำหรับการรักษาการเชื่อมต่อ) และอาจเป็นทรัพยากรอื่น ๆ ที่ไม่ใช่เครือข่ายบนเครื่องไคลเอนต์หากผู้ให้บริการไม่ได้เขียนโค้ดที่มีการจัดการทั้งหมด

ด้วยเหตุนี้สำหรับบางอย่างเช่นการเชื่อมต่อฐานข้อมูลขอแนะนำให้คุณเขียนโค้ดของคุณด้วยเหตุนี้:

using (var connection = new SqlConnection("connection_string_here"))
{
    // Code to use connection here
}

เพื่อให้แน่ใจว่า.Dispose()ถูกเรียกบนอ็อบเจ็กต์การเชื่อมต่อทำให้มั่นใจว่ารีซอร์สที่ไม่มีการจัดการจะถูกล้าง


20
ฉันขอชี้แจงเล็กน้อย: "ทรัพยากรที่ไม่มีการจัดการ" เป็นสิ่งที่คนเก็บขยะไม่รู้ว่าจะทำความสะอาดอย่างไรหลังจากที่ถูกทิ้ง การสมัครสมาชิกของอ็อบเจ็กต์อายุสั้นไปยังเหตุการณ์จากอ็อบเจ็กต์ที่มีอายุการใช้งานยาวนานเช่นจะเป็นรีซอร์สที่ไม่มีการจัดการแม้ว่าอ็อบเจ็กต์ทั้งสองจะอยู่ภายใต้การควบคุมของตัวรวบรวมขยะเนื่องจาก GC จะไม่มีทางรู้ว่าการสมัครสมาชิก ควรยกเลิกหากสมาชิกถูกละทิ้ง แต่ผู้เผยแพร่ไม่อยู่ หากสามารถสร้างและละทิ้งจำนวนสมาชิกที่ไม่ถูกผูกไว้ได้ในช่วงชีวิตของผู้เผยแพร่โฆษณาจะทำให้หน่วยความจำรั่วไหล
supercat

12
เพิ่มความชัดเจนอีกเล็กน้อย: SqlConnection (หรือ FileStream ฯลฯ ) เป็นทรัพยากรที่มีการจัดการซึ่งใช้ทรัพยากรที่ไม่มีการจัดการภายในซึ่ง GC ไม่รู้จัก
jimvfr

2
jimvfr ถูกต้อง SqlConnection เป็นตัวอย่างของทรัพยากรที่มีการจัดการ ตัวอย่างของทรัพยากรที่ไม่มีการจัดการคือเมื่อเราต้องการจัดสรรหน่วยความจำจากหน่วยความจำที่ไม่มีการจัดการโดยใช้วิธีการ Marshal AllocHGlobal () ซึ่งเป็นทรัพยากรที่ไม่มีการจัดการในกรณีนี้แนวทางปฏิบัติที่ดีที่สุดคือใช้ตัวทำลาย (~ ctor) และเรียก Marshal.FreeHGlobal () เพื่อปลดปล่อยความทรงจำนี้
Ygor Thomaz

คุณช่วยยกตัวอย่างทรัพยากรที่มีการจัดการและไม่มีการจัดการได้ไหม
Radha Manohar

32

ทรัพยากรที่มีการจัดการคือทรัพยากรที่เป็นรหัส. NET ที่บริสุทธิ์และจัดการโดยรันไทม์และอยู่ภายใต้การควบคุมโดยตรง

ทรัพยากรที่ไม่มีการจัดการคือทรัพยากรที่ไม่มี จัดการไฟล์หน่วยความจำที่ตรึงวัตถุ COM การเชื่อมต่อฐานข้อมูลเป็นต้น


13

ในคำถามและคำตอบทรัพยากรที่ไม่มีการจัดการคืออะไร 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 () จะทำสองสิ่งให้คุณ:

  1. ช่วยให้คุณสามารถกำจัดทรัพยากรใด ๆ ที่คุณได้รับโดยตรงจากระบบปฏิบัติการที่อยู่ด้านหลังของ. NET (ทรัพยากรที่ไม่มีการจัดการ)

  2. ช่วยให้คุณและโทรติดต่อของคุณจะปล่อยวัตถุหนัก .NET / วัตถุ NET ที่มีการถือครองทรัพยากรอันมีค่าในมือน้อยของพวกเขาสกปรกที่คุณ / โทรติดต่อของคุณต้องการการปล่อยตัวออกมาในขณะนี้

หมายเหตุ:โดยการดำเนินการIDisposableและจึงให้Dispose()วิธีการที่คุณจะช่วยให้ผู้ใช้ของชั้นเรียนของคุณที่จะปล่อยในกำหนดแฟชั่นทรัพยากรที่ไม่มีการจัดการใด ๆ ที่จัดโดยอินสแตนซ์ของคลาส


1การเชื่อมโยงร่วมกันครั้งแรกในคำตอบของชิน Shanbhag อ้างถึงเนื้อหาในวันที่ 2005-11-17 โปรดทราบว่าฉันได้คัดลอกเนื้อหาที่ยกมาเล็กน้อย


5

ความแตกต่างพื้นฐานระหว่างทรัพยากรที่มีการจัดการและไม่มีการจัดการคือตัวรวบรวมขยะรู้เกี่ยวกับทรัพยากรที่มีการจัดการทั้งหมดในบางช่วงเวลา GC จะเข้ามาและล้างหน่วยความจำและทรัพยากรทั้งหมดที่เกี่ยวข้องกับอ็อบเจ็กต์ที่ถูกจัดการ GC ไม่รู้เกี่ยวกับทรัพยากรที่ไม่มีการจัดการเช่นไฟล์สตรีมและแฮนเดิลดังนั้นหากคุณไม่ล้างข้อมูลเหล่านี้อย่างชัดเจนในโค้ดของคุณคุณจะพบกับหน่วยความจำรั่วและทรัพยากรที่ถูกล็อก

สำหรับรายละเอียดเพิ่มเติม - http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources


1
"แนวคิดเบื้องหลังอินเทอร์เฟซ IDisposable คือให้คุณทำความสะอาดทรัพยากรในรูปแบบที่กำหนดและล้างทรัพยากรที่ไม่มีการจัดการ" สุดยอดมาก!
zionpi

0

รีซอร์สที่มีการจัดการคือรีซอร์สที่ตัวรวบรวมขยะสามารถทำให้เป็นอิสระได้และรีซอร์สที่ไม่มีการจัดการไม่สามารถปลดปล่อยโดยตัวรวบรวมขยะสำหรับตัวทำลายวัตถุประสงค์นี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.