Sự khác biệt giữa người quản lý và người quản lý


138

Thỉnh thoảng tôi nghe / đọc về nó khi nói về .NET, ví dụ "mã được quản lý" và "mã không được quản lý" nhưng tôi không biết chúng là gì và sự khác biệt của chúng là gì. Sự khác biệt của họ, theo định nghĩa là gì? Hậu quả của việc sử dụng một trong hai là gì? Sự khác biệt này chỉ tồn tại trong .NET / Windows?


Câu trả lời:


190

Mã được quản lý

Mã được quản lý là những gì trình biên dịch Visual Basic .NET và C # tạo ra. Nó chạy trên CLR (Thời gian chạy ngôn ngữ chung), trong số những thứ khác, cung cấp các dịch vụ như thu gom rác, kiểm tra loại thời gian chạy và kiểm tra tham chiếu. Vì vậy, hãy nghĩ về nó như là "Mã của tôi được quản lý bởi CLR."

Visual Basic và C # chỉ có thể tạo mã được quản lý, vì vậy, nếu bạn đang viết một ứng dụng bằng một trong những ngôn ngữ bạn đang viết một ứng dụng do CLR quản lý. Nếu bạn đang viết một ứng dụng trong Visual C ++ .NET, bạn có thể tạo mã được quản lý nếu bạn muốn, nhưng đó là tùy chọn.

Mã không được quản lý

Mã không được quản lý biên dịch thẳng vào mã máy. Vì vậy, theo định nghĩa đó, tất cả mã được biên dịch bởi trình biên dịch C / C ++ truyền thống là 'mã không được quản lý'. Ngoài ra, vì nó biên dịch thành mã máy và không phải là ngôn ngữ trung gian nên nó không thể mang theo được.

Không có quản lý bộ nhớ miễn phí hoặc bất cứ điều gì khác mà CLR cung cấp.

Vì bạn không thể tạo mã không được quản lý bằng Visual Basic hoặc C #, trong Visual Studio, tất cả mã không được quản lý được viết bằng C / C ++.

Trộn hai

Vì Visual C ++ có thể được biên dịch thành mã được quản lý hoặc không được quản lý, nên có thể trộn cả hai trong cùng một ứng dụng. Điều này làm mờ ranh giới giữa hai và làm phức tạp định nghĩa, nhưng điều đáng nói là chỉ để bạn biết rằng bạn vẫn có thể bị rò rỉ bộ nhớ nếu, ví dụ, bạn đang sử dụng thư viện bên thứ ba với một số mã không được quản lý bằng văn bản.

Đây là một ví dụ tôi tìm thấy bởi 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
"Vì bạn không thể tạo mã không được quản lý bằng Visual Basic hoặc C #, nên tất cả mã không được quản lý được viết bằng C / C ++."? Bạn biết đấy, có những ngôn ngữ khác ngoài C, C ++, C # và VB. Tôi sử dụng Delphi để viết mã không được quản lý. Ngoài ra, một điểm khác biệt khá rõ ràng giữa mã được quản lý (.NET) và mã không được quản lý (Win32) là cái trước có thể sử dụng tất cả các hàm .NET, trong khi cái sau sử dụng API Windows gốc.
Andreas Rejbrand

22
Các thuật ngữ 'được quản lý' và 'không được quản lý' đã được phát minh để phân biệt mã máy với IR. Vì vậy, chúng chỉ thực sự có ý nghĩa trong bối cảnh của .NET . Hạt nhân linux cũng biên dịch thành mã không được quản lý, nhưng điều đó không thực sự phù hợp với cuộc thảo luận, phải không?
Kurige

6
Điều này không đúng chủ đề, nhưng quan điểm của tôi là bạn không có tùy chọn viết mã được quản lý trong Delphi, do đó nói rằng bạn viết mã không được quản lý trong Delphi là rất dư thừa. Trong mọi trường hợp, tôi đã thêm "trong phòng thu trực quan" vào câu vi phạm. Ngoài ra, cảm ơn cho những người đứng đầu về lỗi đánh máy. Bằng cách nào đó tôi đã bỏ lỡ nó ngay cả với lần đọc thứ hai.
Kurige

Chỉ cần là một bàn đạp, bạn có thể viết mã không được quản lý bằng C # ( được gọi là mã "không an toàn" )
Cơ bản

2
@JacksonTale Java không nằm trong ngữ cảnh của .NET, do đó, khái niệm về nó được quản lý hoặc không được quản lý là không thể áp dụng. Xem stackoverflow.com/questions/1326071/ trên để biết giải thích về cách biên dịch Java.
Evan Frisch

84

Điều này là tổng quát hơn .NET và Windows. Managed là một môi trường nơi bạn có quản lý bộ nhớ tự động, thu gom rác, loại an toàn, ... không được quản lý là tất cả mọi thứ khác. Vì vậy, ví dụ .NET là một môi trường được quản lý và C / C ++ không được quản lý.


Theo định nghĩa này, JavaScript cũng sẽ là mã không được quản lý, đúng không?
Hampton Terry

@HamptonTerry Javascript có quản lý bộ nhớ tự động, thu gom rác và loại an toàn ... Vì vậy, không. Javascript được quản lý.
Sancarn

13

Mã được quản lý là một sự khác biệt được tạo ra bởi Microsoft để xác định mã chương trình máy tính yêu cầu và sẽ chỉ thực thi theo "quản lý" của máy ảo Runtime Ngôn ngữ chung (dẫn đến 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.htmlm


1
Đúng. Để thêm vào câu trả lời này, mã được quản lý là mã bạn viết bình thường trong .NET (ví dụ: trong C #), sử dụng các hàm .NET. Các ứng dụng Windows gốc sử dụng API Windows gốc (được viết bằng bất kỳ ngôn ngữ nào, có lẽ là C), mặt khác, "không được quản lý".
Andreas Rejbrand
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.