2012-03-30 42 views
15

Khi tôi viết đoạn sau đây để thử nghiệm các mục đích, nó đã nâng hover-lỗi (xem ảnh chụp màn hình):Sự khác nhau giữa loại không được quản lý và loại được quản lý là gì?

thể không khai báo con trỏ đến kiểu phi không được quản lý 'năng động'

Đoạn:

dynamic* pointerToDynamic = &fields; 

Mặc dù mã rõ ràng là không được phép (bạn không thể lấy địa chỉ của một loại quản lý), nó lớn lên với tôi câu hỏi: là những gì một loại phi không được quản lý và nó khác với loại được quản lý như thế nào? Hay nó chỉ là Visual Studio cố gắng để được vui?

enter image description here

+7

Rõ ràng loại không được quản lý là loại không phải không được quản lý. Mmmm. –

+3

Đừng đọc quá nhiều vào một thông báo lỗi vụng về. C# binder đơn giản không hỗ trợ con trỏ. –

+3

Không có sự khác biệt. Từ ngữ chỉ đơn giản là do hành vi mong đợi. "Con trỏ là loại không được quản lý. Đây không phải là một trong số đó. Đây là loại không được quản lý." Lỗi không phải là các trường được quản lý, đó là các trường là * không được quản lý *, mặc dù hai cụm từ này có cùng ý nghĩa. –

Trả lời

6

Có sự khác biệt giữa các con trỏ không được quản lý và không được quản lý.

Con trỏ được quản lý là một điều khiển cho đối tượng trên vùng được quản lý và AFAIK chỉ khả dụng trong C++ được quản lý. Nó tương đương với C# tham chiếu cho một đối tượng. Con trỏ không được quản lý, mặt khác, tương đương với một con trỏ kiểu C truyền thống, tức là địa chỉ của một vị trí bộ nhớ; C# cung cấp toán tử & đơn nhất, fixed từ khóa và unsafe ngữ cảnh cho điều đó.

Bạn đang cố gắng đưa con trỏ đến trường được quản lý (dynamic thực sự là System.Object là ngụy trang), trong khi C# chỉ cho phép trỏ tới đối tượng không được quản lý, do đó từ ngữ: loại của bạn không được quản lý.

Thêm một chút về điều này here.

Cập nhật: để làm cho nó rõ ràng hơn, được quản lý C++ hỗ trợ cổ điển C-style con trỏtài liệu tham khảo. Nhưng để giữ cho thuật ngữ C++ nhất quán, chúng được gọi là không được quản lýđược quản lýcon trỏ, tương ứng. C# cũng hỗ trợ con trỏ (rõ ràng trong ngữ cảnh unsafe) và tham chiếu (ngầm định bất cứ khi nào các đối tượng tham chiếu), nhưng sau này là không phải là gọi là "con trỏ được quản lý", chúng chỉ là tham chiếu.

Tóm lại: trong C++ có các con trỏ không được quản lý và được quản lý, trong C# - các tham chiếu và tham chiếu không được quản lý.

Hy vọng điều đó có ý nghĩa ngay bây giờ.

+0

Điều đó có ý nghĩa hơn trong ánh sáng của lỗi. Tôi không bao giờ nhận ra không được quản lý và không quản lý được những thứ khác nhau (và có vẻ như bạn chỉ cần giải thích sự khác biệt giữa các con trỏ được quản lý/không được quản lý, lỗi đánh máy?). Nhưng xem xét đoạn cuối của bạn, đó có vẻ là một lời giải thích hợp lý. – Abel

+0

@Abel: Tôi đã cập nhật câu trả lời của mình, xin lỗi nếu nó không rõ ràng. Có lẽ nó tốt hơn một chút rồi. –

+0

Tôi sợ bạn lặp lại những gì bạn đã nói;). Trong dòng đầu tiên, bạn tham khảo sự khác biệt giữa các con trỏ được quản lý ** un ** managed và ** non - **. Sau đó, sau đó không được đề cập trong văn bản của bạn nữa. Tôi biết sự khác biệt giữa (un) con trỏ được quản lý. – Abel

2

Bạn không thể tạo con trỏ cho loại được quản lý. Trong khi int, double, vv được quản lý, chúng có các đối tác không được quản lý.

Vì vậy, những gì loại không được quản lý thực sự có nghĩa là loại được quản lý.

Vấn đề ở đây là loại được quản lý kể từ khi đang ngồi trên heap, bạn không thể lấy con trỏ đến. Bạn có thể lấy con trỏ bằng cách sử dụng cố định từ khóa nhưng chủ yếu là cho mảng.

+0

Vâng, tôi nhận thức được điều đó, cảm ơn. Điều tôi thực sự tò mò là từ ngữ ở đây. Tại sao IntelliSense gọi nó là một loại không được quản lý, khi nó có nghĩa là một loại được quản lý? Trong tất cả các lỗi liên quan khác, nó được gọi đơn giản là một kiểu được quản lý. Có thực sự không có sự khác biệt? Về mặt ngữ nghĩa: Sạch sẽ, ô uế và không ô uế đều khác nhau. Không được quản lý? – Abel

Các vấn đề liên quan