【发布时间】:2014-01-06 06:52:40
【问题描述】:
以下枚举的大小(以字节为单位)是多少?
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));
我不确定是否有必要提及我在 marshaling C# 的本机 Win32 代码中,找到用于管理内存地址的枚举大小至关重要。
【问题讨论】:
-
我能问一下为什么你觉得需要知道枚举值的大小吗?您是否遇到具体问题?仅仅是对枚举的存储方式(即不是字符串或数组)的错误思考吗?
-
@David Heffernan 当然可以,在非托管代码中有一个结构(比如 s1),s1 有一些成员,包括一个联合(这个联合有一个枚举类型成员),我用过
explicit layout kind用于编组 s1 (更明确地避免内存管理的进一步问题!)..所以我想知道枚举的大小以获得联合的大小,然后设置成员的偏移量(地址)之后s1 中的这个联合。我用这篇文章codeproject.com/Articles/66243/…..真实世界的例子部分,第一个例子。 -
不要使用显式。让编译器把它布置出来。它会做对的。只有在联合中使用明确的时间是 FieldOffset(0)。我对你其他问题的回答说明了如何。
-
@DavidHeffernan,我认为我必须使用显式,因为我应该编组的代码太复杂了..有很多包含很多联合的结构,这些联合再次包含具有引用类型的结构成员和值类型成员!!!!..我收到错误消息!!!!..它不像我的问题那么简单。
-
显式无济于事。你只需要得到正确的结构。