ทรัพยากรที่ไม่มีการจัดการคืออะไร?


159

ฉันต้องการรู้เกี่ยวกับทรัพยากรที่ไม่มีการจัดการ ใครช่วยได้โปรดให้แนวคิดเบื้องต้นแก่ฉัน


ดูหน้านี้ซึ่งให้คำอธิบายและรูปแบบที่ยอดเยี่ยมสำหรับการใช้ IDisposable อย่างเหมาะสมและวิธีการจัดการทรัพยากรที่ไม่ได้รับการจัดการ: stackoverflow.com/questions/538060/…
Kyle Baran

คำตอบ:


177

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

ทรัพยากรที่ไม่มีการจัดการคือทุกสิ่งที่ตัวรวบรวมขยะไม่รู้จัก ตัวอย่างเช่น:

  • เปิดไฟล์
  • เปิดการเชื่อมต่อเครือข่าย
  • หน่วยความจำที่ไม่มีการจัดการ
  • ใน XNA: บัฟเฟอร์จุดสุดยอด, ดัชนีบัฟเฟอร์, พื้นผิว ฯลฯ

โดยปกติคุณต้องการปล่อยทรัพยากรที่ไม่มีการจัดการเหล่านั้นก่อนที่คุณจะสูญเสียการอ้างอิงทั้งหมดที่คุณมีกับวัตถุที่จัดการพวกเขา คุณทำได้โดยการโทรหาDisposeวัตถุนั้นหรือ (ใน C #) โดยใช้usingคำสั่งที่จะจัดการกับการโทรDisposeหาคุณ

หากคุณเพิกเฉยต่อDisposeทรัพยากรที่ไม่มีการจัดการอย่างถูกต้องตัวเก็บรวบรวมขยะจะจัดการกับคุณในที่สุดเมื่อวัตถุที่มีทรัพยากรนั้นเก็บรวบรวมขยะ (นี่คือ "การสรุป") แต่เนื่องจากตัวรวบรวมขยะไม่ทราบเกี่ยวกับทรัพยากรที่ไม่มีการจัดการจึงไม่สามารถบอกได้ว่าจำเป็นต้องปล่อยทรัพยากรอย่างไม่ดีดังนั้นจึงเป็นไปได้ที่โปรแกรมของคุณจะทำงานได้ไม่ดีหรือหมดทรัพยากร

หากคุณใช้คลาสด้วยตัวเองที่จัดการทรัพยากรที่ไม่มีการจัดการมันขึ้นอยู่กับคุณที่จะนำไปใช้DisposeและFinalizeถูกต้อง


7
เปิดการเชื่อมต่อฐานข้อมูลอยู่ภายใต้หมวดหมู่ใด จัดการ / ไม่จัดการ?
Deviprasad Das

8
1 คำตอบอื่น ๆ พลาดจุดสำคัญที่คุณจะเรียกทิ้งในการจัดการวัตถุนั้นภายในจัดการพ้นขึ้นของทรัพยากรที่ไม่มีการจัดการมันแรป (เช่นการจัดการไฟล์ GDI + ของบิตแมป, ... ) และถ้าคุณเข้าถึงทรัพยากรที่ไม่มีการจัดการโดยตรง ( PInvoke เป็นต้น) คุณต้องจัดการกับมัน
เอียนเมอร์เซอร์

2
@Dev: ไม่มีการจัดการ - เนื่องจาก GC ไม่รู้จัก (สมมติว่าคุณไม่ได้ใช้ฐานข้อมูลหน่วยความจำที่มีการจัดการบางส่วน) แต่วัตถุการเชื่อมต่อนั้นอาจไม่ถือเป็นทรัพยากรที่ไม่มีการจัดการ สันนิษฐานว่าการเชื่อมต่อฐานข้อมูลใช้การเปิดไฟล์หรือการเชื่อมต่อเครือข่ายที่อื่น - แต่เป็นไปได้ว่าวัตถุอื่น (นอกเหนือจากวัตถุการเชื่อมต่อ) กำลังจัดการทรัพยากรที่ไม่มีการจัดการ (บางทีห้องสมุดฐานข้อมูลของคุณแคชเชื่อมต่อ) ตรวจสอบเอกสารและดูว่ามันจะขอให้คุณโทรหรือการใช้งานDispose using
Andrew Russell

11
ฉันมีความเห็น / คำถามพื้นฐานเกี่ยวกับเรื่องนี้ฉันสามารถสร้างความสัมพันธ์กับวัตถุเป็นจัดการ / ไม่ได้รับการจัดการโดยประเภทเช่นสตริงมีการจัดการชุดข้อมูลจะไม่ได้รับการจัดการ (ซึ่งเป็นเหตุผลว่าทำไมมันมีวิธีการกำจัด) , การเชื่อมต่อฐานข้อมูลนั้นไม่ได้รับการจัดการ (เพราะพวกเขามีการกำจัด) ฯลฯ ดังนั้นสมมติฐานคือถ้ามันมีวิธี "Dispose ()" แสดงว่ามันไม่มีการจัดการ? นอกจากนั้นวัตถุ XmlDocument จะเป็นอย่างไร ขอบคุณ
ganders

15
@ganders นั่นเป็นกฎง่ายๆ แม้ว่าจะทราบว่าอินสแตนซ์คลาส C # ทั้งหมดเป็นวัตถุที่มีการจัดการ หากเป็นตัวอย่างของชั้นเรียนสามารถถือทรัพยากรที่ไม่มีการจัดการแล้วว่าชั้นควรIDisposableดำเนินการ ถ้าชั้นไม่ใช้IDisposableแล้วคุณควรทิ้งกรณีของชั้นเรียนที่มีusingหรือDispose()เมื่อคุณทำกับพวกเขา จากสิ่งนี้การสนทนาของคุณจะถูกเก็บไว้: หากชั้นเรียนดำเนินการIDisposableแล้วก็อาจมีทรัพยากรที่ไม่มีการจัดการภายใน
Andrew Russell

56

ผู้ใช้บางรายจัดอันดับไฟล์ที่เปิดอยู่, การเชื่อมต่อฐานข้อมูล, หน่วยความจำที่จัดสรร, บิตแมป, สตรีมไฟล์ ฯลฯ ในบรรดาทรัพยากรที่มีการจัดการ, อื่น ๆ ที่ไม่มีการจัดการ ดังนั้นพวกเขาจัดการหรือไม่มีการจัดการ?

ความคิดเห็นของฉันคือการตอบสนองมีความซับซ้อนมากขึ้น: เมื่อคุณเปิดไฟล์ใน. NET คุณอาจใช้คลาส System.IO.File, FileStream หรือบางอย่างในตัว เนื่องจากเป็นคลาส NET ปกติจึงมีการจัดการ แต่มันเป็นเสื้อคลุมซึ่งภายในจะ "งานสกปรก" (สื่อสารกับระบบปฏิบัติการโดยใช้ Win32 DLLs เรียกฟังก์ชั่นระดับต่ำหรือแม้กระทั่งคำแนะนำแอสเซมเบลอร์) ซึ่งจริงๆแล้วเปิดไฟล์ และนี่คือสิ่งที่. NET ไม่รู้เกี่ยวกับการจัดการ แต่คุณสามารถเปิดไฟล์ได้ด้วยตัวเองโดยใช้คำสั่งแอสเซมเบลอร์และฟังก์ชันไฟล์บายพาส. NET จากนั้นหมายเลขอ้างอิงและไฟล์ที่เปิดเป็นทรัพยากรที่ไม่มีการจัดการ

เช่นเดียวกันกับฐานข้อมูล: ถ้าคุณใช้ชุดประกอบ DB บางตัวคุณมีคลาสเช่น DbConnection เป็นต้นพวกเขาจะรู้จัก. NET และมีการจัดการ แต่พวกเขาห่อ "งานสกปรก" ซึ่งไม่มีการจัดการ (จัดสรรหน่วยความจำบนเซิร์ฟเวอร์สร้างการเชื่อมต่อกับมัน ... ) หากคุณไม่ได้ใช้คลาส wrapper นี้และเปิดซ็อกเก็ตเครือข่ายด้วยตัวเองและสื่อสารกับฐานข้อมูลแปลก ๆ ของคุณโดยใช้คำสั่งบางอย่างมันจะไม่ได้รับการจัดการ

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

หากคุณไม่ได้ใช้คลาส. NET หรือบุคคลที่สาม wrapper และเปิดไฟล์โดยคำแนะนำของแอสเซมเบลอร์ ฯลฯ ในชั้นเรียนของคุณไฟล์ที่เปิดเหล่านี้จะไม่ได้รับการจัดการและคุณต้องใช้รูปแบบการกำจัด / จบ หากคุณไม่ทำเช่นนั้นจะมีหน่วยความจำรั่วทรัพยากรที่ถูกล็อคตลอดไป ฯลฯ แม้ว่าคุณจะไม่ได้ใช้งานอีกต่อไป (การทำงานของไฟล์เสร็จสมบูรณ์) หรือแม้กระทั่งหลังจากที่แอปพลิเคชันของคุณถูกยกเลิก

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


1
ดีหนึ่งในความชัดเจนเพิ่มเติมบนunmanaged vs managed resources
ตอนนี้เขาที่จะต้องไม่มีชื่อ

ขอบคุณสำหรับคำตอบของคุณ คลาสใดที่เราแนะนำให้เรียกว่า Dispose
BKSpurgeon

2
มันง่ายมาก ในแต่ละคลาสที่คุณใช้คุณต้องตรวจสอบว่าใช้อินเทอร์เฟซ IDisposable หรือไม่ ถ้าใช่ถ้าคุณใช้คลาสดังกล่าวในวิธีใดวิธีหนึ่ง (เช่นการเปิดไฟล์การเก็บข้อความการปิดไฟล์) คุณสามารถใช้รูปแบบที่ใช้ () {} ซึ่งเรียกการทิ้งให้คุณโดยอัตโนมัติ หากคุณใช้คลาสดังกล่าวในวิธีการเพิ่มเติม (เช่น: คลาสของคุณมีไฟล์ในตัวสร้างจะเปิดไฟล์จากนั้นหลายวิธีจะเพิ่มบันทึกบางส่วน ... ) จากนั้นคุณจะต้องใช้อินเตอร์เฟซ IDisposable โดยชั้นเรียนของคุณ และกำจัดวัตถุของคลาสนั้นอย่างเหมาะสม
Martas

1
"... บางตัวในคลาส. NET System.IO.File, FileStream หรืออย่างอื่นเนื่องจากเป็นคลาส NET. ปกติจึงมีการจัดการ" ด้วยความเคารพนี่เป็นสิ่งที่ผิดและทำให้เข้าใจผิด พวกเขาจะไม่ได้จัดการ หากพวกเขาได้รับการจัดการคุณสามารถจัดสรรคลาสเหล่านี้และคาดว่าตัวรวบรวมขยะจะจัดการการจัดสรรคืนทรัพยากรทั้งหมดอย่างเต็มรูปแบบ อย่างไรก็ตามสิ่งนี้จะนำไปสู่การจัดการไฟล์และทรัพยากรที่ไม่มีการจัดการที่ถูกล็อคและเก็บรักษาไว้นานเกินความจำเป็นเนื่องจากตัวรวบรวมขยะจะไม่ทำการจัดสรรคืนคลาสและไม่ได้ทำการสรุปเป็นเวลานาน
AaronLS

1
@AaronLS ในความคิดเห็นของคุณที่คุณพูดถึง "FileStream" โดยอ้างถึงว่าไม่มีการจัดการ แต่ไม่ใช่ภายในแม้ว่ามันจะใช้ทรัพยากรที่ไม่มีการจัดการเพื่อทำงานของมันในโลกที่มีการจัดการ Microsoft ได้ซ่อนสิ่งที่ไม่ได้รับการจัดการมากมายจากคุณ รูปแบบการกำจัด รหัสที่มีการจัดการไม่ได้หมายความว่าจะไม่ใช้ทรัพยากรที่ไม่มีการจัดการ อย่างไรก็ตาม Microsoft ทำได้ดีในการนำเครื่องมือ IDisposable ไปใช้กับวัตถุประเภทนั้น นี่คือหลักฐานตามความจริงที่ว่ามันใช้ IDisposable ในส่วนที่เกี่ยวกับหลักฐานนั้นเราควรพิจารณาว่าเป็นวัตถุที่มีการจัดการ
มาลิกคาลิล

12

ทรัพยากรที่ไม่มีการจัดการคือทรัพยากรที่ทำงานนอก. NET runtime (CLR) (หรือที่เรียกว่าไม่ใช่รหัส NET) ตัวอย่างเช่นการเรียกใช้ DLL ใน Win32 API หรือการเรียกไปยัง. dll ที่เขียนใน C ++


6

"ทรัพยากรที่ไม่มีการจัดการ" ไม่ใช่เรื่อง แต่เป็นความรับผิดชอบ หากวัตถุเป็นเจ้าของทรัพยากรที่ไม่มีการจัดการนั่นหมายถึง (1) บางเอนทิตี้ภายนอกถูกจัดการในลักษณะที่อาจทำให้เกิดปัญหาหากไม่ได้ล้างข้อมูลและ (2) วัตถุนั้นมีข้อมูลที่จำเป็นในการล้างข้อมูลดังกล่าวและรับผิดชอบ สำหรับการทำมัน

แม้ว่าทรัพยากรที่ไม่มีการจัดการหลายประเภทจะเกี่ยวข้องอย่างมากกับเอนทิตีของระบบปฏิบัติการหลายประเภท (ไฟล์, GDI จัดการ, บล็อกหน่วยความจำที่จัดสรร ฯลฯ ) ไม่มีเอนทิตีประเภทเดียวที่แชร์โดยพวกเขาทั้งหมดนอกเหนือจากความรับผิดชอบของ ทำความสะอาด. โดยทั่วไปหากวัตถุใดมีความรับผิดชอบในการดำเนินการล้างข้อมูลนั้นจะมีวิธีการกำจัดซึ่งจะสั่งให้ดำเนินการล้างข้อมูลทั้งหมดที่รับผิดชอบ

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

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


5

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

ถูกขโมยจากที่นี่โปรดอ่านโพสต์ทั้งหมด


2

ทรัพยากรใด ๆ ที่มีการจัดสรรหน่วยความจำใน. NET ที่ได้รับการจัดการฮีปคือทรัพยากรที่มีการจัดการ CLR รับรู้ถึงหน่วยความจำประเภทนี้อย่างสมบูรณ์และจะทำทุกอย่างเพื่อให้แน่ใจว่ามันจะไม่ได้ถูกนำไปใช้งาน สิ่งอื่นใดที่ไม่มีการจัดการ ตัวอย่างเช่นการสอดแทรกด้วย COM อาจสร้างวัตถุในพื้นที่หน่วยความจำที่ประมวลผล แต่ CLR จะไม่ดูแล ในกรณีนี้วัตถุที่มีการจัดการที่ทำให้การโทรข้ามเขตแดนที่มีการจัดการควรเป็นเจ้าของความรับผิดชอบสำหรับสิ่งอื่น ๆ นอกเหนือจากนั้น


0

ให้เราเข้าใจก่อนว่าโปรแกรม VB6 หรือ C ++ (แอปพลิเคชันที่ไม่ใช่ Dotnet) ใช้ในการดำเนินการอย่างไร เรารู้ว่าคอมพิวเตอร์เข้าใจรหัสระดับเครื่องเท่านั้น รหัสระดับเครื่องจะเรียกว่าเป็นรหัสดั้งเดิมหรือไบนารี ดังนั้นเมื่อเรารันโปรแกรม VB6 หรือ C ++ คอมไพเลอร์ภาษานั้นจะรวบรวมซอร์สโค้ดภาษาตามลำดับให้เป็นเนทีฟโค้ดซึ่งสามารถเข้าใจได้จากระบบปฏิบัติการและฮาร์ดแวร์

รหัสเนทีฟ (Unmanaged Code) เป็นรหัสเฉพาะ (เนทีฟ) สำหรับระบบปฏิบัติการที่สร้างขึ้น หากคุณใช้โค้ดเนทีฟที่คอมไพล์แล้วและพยายามเรียกใช้บนระบบปฏิบัติการอื่นมันจะล้มเหลว ดังนั้นปัญหาของการใช้โปรแกรมในลักษณะนี้ก็คือมันไม่สามารถพกพาได้จากแพลตฟอร์มหนึ่งไปสู่อีกแพลตฟอร์มหนึ่ง

ให้เราเข้าใจว่าโปรแกรม. Net ดำเนินการอย่างไร การใช้ dotnet เราสามารถสร้างแอปพลิเคชั่นประเภทต่างๆ แอปพลิเคชั่น. NET ที่พบได้ทั่วไปบางประเภท ได้แก่ Web, Windows, Console และ Mobile Applications โดยไม่คำนึงถึงประเภทของแอปพลิเคชันเมื่อคุณรันแอปพลิเคชัน. NET ใด ๆ จะเกิดสิ่งต่อไปนี้

  1. แอปพลิเคชั่น. NET ได้รับการรวบรวมเป็นภาษาระดับกลาง (IL) IL เรียกอีกอย่างหนึ่งว่าภาษากลางสามัญ (CIL) และ Microsoft Intermediate language (MSIL) ทั้งแอปพลิเคชั่น. NET และที่ไม่ใช่. NET สร้างแอสเซมบลี แอสเซมบลีมีนามสกุลเป็น. DLL หรือ. EXE ตัวอย่างเช่นถ้าคุณรวบรวมแอปพลิเคชัน windows หรือ Console คุณจะได้รับ. EXE โดยที่เมื่อเรารวบรวมเว็บหรือโครงการห้องสมุด Class ที่เราได้รับเป็น. DLL ความแตกต่างระหว่างแอสเซมบลี. NET และ NON .NET คือแอสเซมบลี DOTNET อยู่ในรูปแบบภาษากลางซึ่งเป็นแอสเซมบลีที่ไม่ใช่ DOTNET ในรูปแบบรหัสเนทิฟ

  2. แอปพลิเคชั่นที่ไม่ใช่ DOTNET สามารถเรียกใช้โดยตรงที่ด้านบนของระบบปฏิบัติการซึ่งเป็นแอปพลิเคชัน DOTNET ที่ทำงานบนสภาพแวดล้อมเสมือนจริงที่เรียกว่า Common Language Runtime (CLR) CLR มีส่วนประกอบที่เรียกว่า Just In-Time Compiler (JIT) ซึ่งจะแปลงภาษาระดับกลางเป็นโค้ดเนทีฟซึ่งระบบปฏิบัติการพื้นฐานสามารถเข้าใจได้

ดังนั้นใน. NET การประมวลผลแอปพลิเคชันประกอบด้วย 2 ขั้นตอน 1. คอมไพเลอร์ภาษารวบรวมซอร์สโค้ดเป็นภาษากลาง (IL) 2. คอมไพเลอร์ JIT ใน CLR แปลง IL เป็นโค้ดเนทีฟซึ่งสามารถทำงานบนระบบปฏิบัติการพื้นฐาน .

เนื่องจากแอสเซมบลี. NET อยู่ในรูปแบบ Intermedaite Language และไม่ใช่โค้ดเนทีฟแอสเซมบลี. NET จึงสามารถพกพาไปยังแพลตฟอร์มใด ๆ ได้ตราบใดที่แพลตฟอร์มเป้าหมายมี Common Language Runtime (CLR) CLR ของแพลตฟอร์มเป้าหมายแปลงภาษา Intermedaite เป็นโค้ดเนมที่ระบบปฏิบัติการพื้นฐานสามารถเข้าใจได้ Languge ระดับกลางจะเรียกว่าเป็นรหัสที่ได้รับการจัดการ นี่เป็นเพราะ CLR จัดการรหัสที่ทำงานอยู่ภายใน ตัวอย่างเช่นในโปรแกรม VB6 ผู้พัฒนามีหน้าที่ในการจัดสรรหน่วยความจำที่ใช้โดยวัตถุ หากโปรแกรมเมอร์ลืมที่จะจัดสรรหน่วยความจำเราอาจพบว่ายากที่จะแยกหน่วยความจำออกจากข้อยกเว้น ในทางกลับกันโปรแกรมเมอร์. NET ไม่จำเป็นต้องกังวลเกี่ยวกับการยกเลิกการจัดสรรหน่วยความจำที่ใช้โดยวัตถุ การจัดการหน่วยความจำอัตโนมัติหรือที่เรียกว่าการรวบรวม grabage มีให้โดย CLR ออกจากกัน จากการรวบรวมขยะมีประโยชน์อื่น ๆ อีกมากมายโดย CLR ซึ่งเราจะหารือในเซสชั่นในภายหลัง เนื่องจาก CLR กำลังจัดการและดำเนินการ Intermediate Language จึงเรียกว่าเป็นรหัสที่ได้รับการจัดการ

.NET รองรับภาษาโปรแกรมต่าง ๆ เช่น C #, VB, J # และ C ++ C #, VB และ J # สามารถสร้างรหัสที่ได้รับการจัดการ (IL) เท่านั้นโดยที่ C ++ สามารถสร้างทั้งรหัสที่ได้รับการจัดการ (IL) และรหัสที่ไม่ได้รับการจัดการ (รหัสเนทีฟ)

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

โปรแกรม. NET นั้นคล้ายกับการทำงานของโปรแกรมจาวา ในจาวาเรามีรหัสไบต์และ JVM (Java Virtual Machine) โดยที่ใน. NET เราภาษาระดับกลางและ CLR (Common Language Runtime)

นี่มาจากลิงก์นี้ - เขาเป็นติวเตอร์ที่ยอดเยี่ยม http://csharp-video-tutorials.blogspot.in/2012/07/net-program-execution-part-1.html

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