Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the difference between a non-unmanaged type and a managed type?

When I wrote the following snippet for experimenting purposes, it raised the hover-error (see screenshot):

Cannot declare pointer to non-unmanaged type 'dynamic'

The snippet:

dynamic* pointerToDynamic = &fields;

While the code is clearly not allowed (you cannot take the address of a managed type), it raised with me the question: what is a non-unmanaged type and how is it different to a managed type? Or is it just Visual Studio trying to be funny?

enter image description here

like image 386
Abel Avatar asked Mar 30 '12 10:03

Abel


People also ask

What is the difference between managed & unmanaged code?

Difference between managed and unmanaged code? Managed code is the one that is executed by the CLR of the . NET framework while unmanaged or unsafe code is executed by the operating system. The managed code provides security to the code while undamaged code creates security threats.

What is unmanaged type?

A type is an unmanaged type if it's any of the following types: sbyte , byte , short , ushort , int , uint , long , ulong , char , float , double , decimal , or bool. Any enum type. Any pointer type.


2 Answers

There is a difference between unmanaged and non-managed pointers.

A managed pointer is a handle to an object on the managed heap, and AFAIK is available in managed C++ only. It is equivalent of C# reference to an object. Unmanaged pointer, on the other hand, is equivalent of a traditional C-style pointer, i.e. address of a memory location; C# provides unary & operator, fixed keyword and unsafe context for that.

You are trying to get a pointer to a managed field (dynamic is actually System.Object is disguise), while C# allows pointers to unmanaged objects only, hence the wording: your type is non-unmanaged.

A bit more on this here.

Update: to make it more clear, managed C++ supports classic C-style pointers and references. But to keep C++ terminology consistent, they are called unmanaged and managed pointers, correspondingly. C# also supports pointers (explicitly in unsafe context) and references (implicitly whenever objects of reference types are involved), but the latter is not called "managed pointers", they are just references.

To sum up: in C++ there are unmanaged and managed pointers, in C# - unmanaged pointers and references.

Hope it makes sense now.

like image 198
Igor Korkhov Avatar answered Sep 24 '22 14:09

Igor Korkhov


You cannot create a pointer to a managed type. While int, double, etc are managed, they have unmanaged counterparts.

So what non-unmanaged type really means is the managed type.

The problem here is that the managed type since is sitting on the heap, you cannot get a pointer to. You can get a pointer using fixed keyword but that is mainly for arrays.

like image 40
Aliostad Avatar answered Sep 23 '22 14:09

Aliostad