Question

What is the size of the enum below in bytes?

public enum MMTPCnxNckRsn 
{
    MMTPCnxNckRsnNoAnswer = -2, 
    MMTPCnxNckRsnSendError = -1, 
    MMTPCnxNckRsnOk = 0, 
    MMTPCnxNckRsnInvalidMember = 1, 
    MMTPCnxNckRsnHubNotReady = 2, 
    MMTPCnxNckRsnUnknownMember = 3, 
    MMTPCnxNckRsnLastCnxTooRecent = 4, 
    MMTPCnxNckRsnInvalidVersion = 5, 
    MMTPCnxNckRsnInvalidOptions = 6, 
    MMTPCnxNckRsnTooManyCnx = 7 
};

I've used the code below to find it but I think it is not enough. It is a string array with 10 elements. Should I count the chars in each element, assume each char to be 1 byte, and add all bytes of elements? What about unsigned numbers?

var size = Enum.GetNames(typeof(MMTPCnxNckRsn)).Length;
var arr = Enum.GetNames(typeof (MMTPCnxNckRsn));

I'm not sure if it is important to mention that I am in the middle of marshaling a native Win32 code to C#, and it is CRUCIAL to find the size of the enum for managing addresses in memory.

Was it helpful?

Solution

The documentation says:

The default underlying type of enumeration elements is int.

Therefore, your data type will have the size of 4 bytes, which is the size of an int.
You can confirm this by using the following command:

Marshal.SizeOf(Enum.GetUnderlyingType(typeof(MMTPCnxNckRsn)));

Whilst you refer to the enum values in source code using a name, they are represented in the code that runs on the machine as integer values. So your comment about string arrays is quite wide of the mark.

I also think you are over-thinking the issue of size. Looking at your other recent question, you seem to be translating a C++ structure to C# for pinvoke. Well, the C# enum will map straight onto the C++ enum. The pinvoke marshaller will look after the sizes and lay them out for you. You do not need to handle that explicitly.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top