【问题标题】:Enum Size in Bytes枚举大小(以字节为单位)
【发布时间】: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,我认为我必须使用显式,因为我应该编组的代码太复杂了..有很多包含很多联合的结构,这些联合再次包含具有引用类型的结构成员和值类型成员!!!!..我收到错误消息!!!!..它不像我的问题那么简单。
  • 显式无济于事。你只需要得到正确的结构。

标签: c# pinvoke


【解决方案1】:

documentation 说:

枚举元素的默认底层类型是int。

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

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

虽然您在源代码中使用名称来引用枚举值,但它们在机器上运行的代码中表示为整数值。所以你对字符串数组的评论是相当广泛的。

我也认为您在尺寸问题上考虑过度了。查看您最近的另一个问题,您似乎正在将 C++ 结构转换为 C# 以进行 pinvoke。好吧,C# 枚举将直接映射到 C++ 枚举。 pinvoke marshaller 将照顾尺寸并为您布置它们。您不需要明确处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2018-01-01
    • 2013-02-01
    • 2014-01-27
    • 2013-04-26
    • 2016-03-19
    • 1970-01-01
    相关资源
    最近更新 更多