枚举大小(以字节为单位)

13

以下枚举的大小是多少字节?

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

我已经使用以下代码进行查找,但我认为这还不够。它是一个包含10个元素的字符串数组。我应该计算每个元素中的字符数,假设每个字符占用1个字节,并将所有元素的字节相加吗?那么无符号数字呢?

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

我不确定是否有必要提到我正在将本地Win32代码转换为C#,而且非常重要的是找到用于管理内存地址的枚举类型的大小。


我可以问一下您为什么需要知道枚举值的大小吗?您是否遇到了具体的问题?这是因为您对枚举的存储方式存在误解(即不是作为字符串或数组)吗? - David Heffernan
@David Heffernan 当然可以,在非托管代码中有一个结构体(比如说s1),s1有一些成员,其中包括一个联合体(这个联合体有一个枚举类型的成员)。我使用了“显式布局”来进行s1的封送(更加明确并避免了内存管理方面的问题!)所以我想知道枚举的大小以获取联合体的大小,并设置在s1中该联合体之后的成员的偏移量(地址)。我使用了这篇文章http://www.codeproject.com/Articles/66243/Marshaling-with-C-Chapter-3-Marshaling-Compound-Ty .. 其中的“真实世界示例”部分,第一个示例。 - Paridokht
1
不要使用显式。让编译器自己布局,它会做得很好。唯一需要使用显式的情况是在联合体中的FieldOffset(0)。我在你另一个问题的答案中已经展示了如何使用。 - David Heffernan
@DavidHeffernan,我认为我必须使用显式类型转换,因为我要封送的代码太复杂了。其中有很多结构体,这些结构体又包含了许多带有引用类型成员和值类型成员的联合体!!!..而且我收到了错误消息!!!..它并不像我的问题描述得那么简单。 - Paridokht
明确声明并不能帮助你,你只需要正确地处理结构体即可。 - David Heffernan
1个回答

25

根据文档

枚举元素的默认基础类型为int。

因此,您的数据类型将具有4字节的大小,这是int的大小。
您可以使用以下命令确认此信息:

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

虽然在源代码中您使用名称引用枚举值,但它们在运行在机器上的代码中表示为整数值。因此,您对字符串数组的评论完全不准确。

我认为您也过于考虑了大小问题。看一下您最近的另一个问题,似乎您正在将C++结构转换为C#以供P/Invoke使用。好吧,C#枚举将直接映射到C++枚举。P/Invoke marshaller会处理大小并为您设置布局。您不需要显式处理它们。


在较新的.NET版本中(我相信自.NET Core 1以来),您可以使用Unsafe.SizeOf<MMTPCnxNckRsn>()。这样更加简洁,并且应该执行得更快。 - JamesHoux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接