ความแตกต่างระหว่าง“ จัดการ” และ“ ไม่ได้รับการจัดการ”


138

บางครั้งฉันได้ยิน / อ่านเกี่ยวกับเรื่องนี้เมื่อพูดถึง. NET ตัวอย่างเช่น "รหัสที่ได้รับการจัดการ" และ "รหัสที่ไม่มีการจัดการ" แต่ฉันไม่รู้ว่ามันคืออะไรและอะไรคือความแตกต่างของพวกเขา อะไรคือความแตกต่างของพวกเขาตามคำจำกัดความ? การใช้งานอย่างใดอย่างหนึ่งมีผลอะไรบ้าง ความแตกต่างนี้มีอยู่ใน. NET / Windows เท่านั้นหรือไม่


1
มีความเป็นไปได้ที่ซ้ำกันของรหัสที่ถูกจัดการ / ไม่ได้รับการจัดการใน C # คืออะไร
nawfal

คำตอบ:


190

จัดการรหัส

รหัสที่ได้รับการจัดการคือสิ่งที่ Visual Basic .NET และ C # คอมไพเลอร์สร้าง มันทำงานบน CLR (Common Language Runtime) ซึ่งเหนือสิ่งอื่นใดให้บริการเช่นการรวบรวมขยะการตรวจสอบประเภทรันไทม์และการตรวจสอบการอ้างอิง ดังนั้นคิดว่าเป็น "รหัสของฉันมีการจัดการโดย CLR"

Visual Basic และ C # สามารถทำได้เท่านั้นผลิตการจัดการรหัสดังนั้นถ้าคุณกำลังเขียนโปรแกรมประยุกต์ในหนึ่งในภาษาที่คุณกำลังเขียนโปรแกรมประยุกต์การจัดการโดยการ CLR หากคุณกำลังเขียนแอปพลิเคชันใน Visual C ++ .NET คุณสามารถสร้างรหัสที่มีการจัดการได้หากต้องการ แต่เป็นทางเลือก

รหัสที่ไม่มีการจัดการ

รหัสที่ไม่มีการจัดการรวบรวมตรงกับรหัสเครื่อง ดังนั้นตามคำนิยามนั้นโค้ดทั้งหมดที่คอมไพล์ด้วยคอมไพเลอร์ C / C ++ ดั้งเดิมคือ 'โค้ดที่ไม่มีการจัดการ' นอกจากนี้เนื่องจากมันรวบรวมรหัสเครื่องและไม่ใช่ภาษากลางจึงไม่สามารถพกพาได้

ไม่มีการจัดการหน่วยความจำฟรีหรืออะไรก็ตามที่ CLR นำเสนอ

เนื่องจากคุณไม่สามารถสร้างรหัสที่ไม่มีการจัดการด้วย Visual Basic หรือ C # ใน Visual Studio รหัสที่ไม่มีการจัดการทั้งหมดจะถูกเขียนใน C / C ++

ผสมทั้งสอง

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

นี่คือตัวอย่างที่ฉันพบโดยgoogling :

#using <mscorlib.dll>
using namespace System;

#include "stdio.h"

void ManagedFunction()
{
    printf("Hello, I'm managed in this section\n");
}

#pragma unmanaged
UnmanagedFunction()
{
    printf("Hello, I am unmanaged through the wonder of IJW!\n");
    ManagedFunction();
}

#pragma managed
int main()
{
    UnmanagedFunction();
    return 0;
}

11
"เนื่องจากคุณไม่สามารถสร้างรหัสที่ไม่มีการจัดการด้วย Visual Basic หรือ C # รหัสที่ไม่ได้รับการจัดการทั้งหมดจะถูกเขียนใน C / C ++"? คุณรู้ว่ามีภาษาอื่นนอกเหนือจาก C, C ++, C # และ VB ฉันใช้ Delphi เพื่อเขียนรหัสที่ไม่มีการจัดการ นอกจากนี้ความแตกต่างที่มองเห็นได้อย่างหนึ่งระหว่างรหัสที่ได้รับการจัดการ (.NET) และไม่มีการจัดการ (Win32) คือสิ่งที่อดีตสามารถใช้ฟังก์ชั่น. NET ทั้งหมดได้ในขณะที่หลังใช้ API ของ Windows ดั้งเดิม
Andreas Rejbrand

22
ข้อกำหนด 'ที่มีการจัดการ' และ 'ที่ไม่มีการจัดการ' ถูกประดิษฐ์ขึ้นเพื่อแยกความแตกต่างของรหัสเครื่องจาก IR ดังนั้นพวกเขาจึงมีความหมายในบริบทของ. NETเท่านั้น เคอร์เนลลินุกซ์ยังรวบรวมรหัสที่ไม่มีการจัดการ แต่นั่นไม่เกี่ยวข้องกับการอภิปรายใช่หรือไม่
kurige

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

เพียงเพื่อเป็น pedand เป็นไปได้ที่จะเขียนรหัสที่ไม่มีการจัดการใน C # ( เรียกว่ารหัส "ไม่ปลอดภัย" )
พื้นฐาน

2
@JacksonTale Java ไม่ได้อยู่ในบริบทของ. NET ดังนั้นแนวคิดของการจัดการหรือไม่มีการจัดการจะไม่สามารถใช้ได้ ดูstackoverflow.com/questions/1326071/…สำหรับคำอธิบายว่า Java รวบรวมอย่างไร
Evan Frisch

84

นี่คือทั่วไปมากกว่า. NET และ Windows Managed คือสภาพแวดล้อมที่คุณมีการจัดการหน่วยความจำอัตโนมัติ, การรวบรวมขยะ, ความปลอดภัยของประเภท, ... ไม่มีการจัดการเป็นอย่างอื่น ตัวอย่างเช่น. NET คือสภาพแวดล้อมที่มีการจัดการและ C / C ++ ไม่ได้รับการจัดการ


ตามคำจำกัดความนี้จาวาสคริปต์จะเป็นโค้ดที่ไม่มีการจัดการเช่นกันถูกต้องไหม?
Hampton Terry

@HamptonTerry Javascript มีการจัดการหน่วยความจำอัตโนมัติการรวบรวมขยะและความปลอดภัยของประเภท ... ไม่เลย มีการจัดการ Javascript
Sancarn

13

รหัสที่ได้รับการจัดการคือความแตกต่างที่ประกาศเกียรติคุณจาก Microsoft เพื่อระบุรหัสโปรแกรมคอมพิวเตอร์ที่ต้องการและจะดำเนินการภายใต้ "การจัดการ" ของเครื่องเสมือนภาษา Common Language Runtime (ส่งผลให้เกิด Bytecode)

http://en.wikipedia.org/wiki/Managed_code

http://www.developer.com/net/cplus/article.php/2197621/Managed-Unmanaged-Native-What-Kind-of-Code-Is-This.htm


1
ใช่. หากต้องการเพิ่มคำตอบนี้รหัสที่ได้รับการจัดการคือรหัสที่คุณเขียนตามปกติใน. NET (ใน C # เป็นต้น) โดยใช้ฟังก์ชัน. NET แอปพลิเคชัน Windows ดั้งเดิมที่ใช้ Native API ของ Windows (อาจเขียนด้วยภาษาใด ๆ C) ในทางกลับกันจะ "ไม่มีการจัดการ"
Andreas Rejbrand
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.