What is the reason for specifying an Enum as uint?
我遇到了一些继承了
例子:
1 2 3 4 | Enum myEnum : uint { ... } |
有什么优势或具体的原因有人会这么做吗?为什么不把它作为默认值?
如果枚举值大于2147483647且非负。
我能想到的一个原因是范围检查更容易。考虑到大多数枚举从0开始,您只需要检查上限。
我想这是为了让它自动转换为uint(在c中,枚举被类型系统视为int)。很可能允许对枚举的标志值进行按位排序。参见http://www.velocityreviews.com/forums/t286596-enums-in-c-and-c.html
在某些情况下,使用.NET中的com interop/p/invoke非常方便和必要。例如,您一定会在pinvoke.net上找到一些这样定义的。在某些情况下,它只是更接近底层API定义,但不是必需的,但在某些情况下,底层API可能会使用其中一些高位作为标记,并且需要uint。在interop之外,您也可以使用一些非常高的位作为标记,仅在普通的c/vb.net中使用,这也可能需要uint。
我正在将一些最初用C编写的消息传递代码转换为C。
C代码中的某些字段有一组有限的可能值,这些值被定义为一组关联的定义。换句话说,是一个枚举。
在转换某些枚举时,某些值对于整数来说太大,例如
#无定义0x00000000
#定义val1 0x00000001
…
#定义VALX 0x8000000
在这里,对于C中的默认枚举,valx是不可接受的,因此枚举必须转换为uint,uint也是记录结构中存储变量的类型。
我知道另一个原因,因为一个同事在这里做的。
为了避免这里解释的问题(第2项),在生成枚举列表时,他根据字符串给它一个唯一的值(我不清楚现在如何,它不能是hashcode'cos that's not unique)。
唯一的问题是这些数字有点大,所以他把枚举设置为uint。
看起来他们这样做纯粹是为了这个错误,这意味着可能还有更多的错误没有在这个类中实现。
1 2 3 4 | /// <summary> /// There was an HTTP error in issuing the request. /// </summary> HttpError = 0xFFFF0000 |
我所说的例子在这里的代码中:http://www.codeplex.com/facebooknet
看看facebookresponsestatus.cs类
我可以给作者发电子邮件,但我不想费事,只想看看一般社区的人们基于其他经验的想法。
我不打算在codeplex上使用这个框架,而是回顾它,看看其他人是如何将facebook实现到.net上的。我只是觉得这很有趣,想知道为什么:uint代表那里的枚举。