[英]What is the reason for specifying an Enum as uint?
我遇到了一些繼承了uint
的枚舉器。 我不明白為什么有人會這樣做。
例子:
Enum myEnum : uint
{
...
}
有人會這樣做的任何優勢或具體原因? 為什么不把它保留為 defaultint?
如果枚舉值大於2,147,483,647,並且為非負數。
我猜想已經完成了它使其自動轉換為uint的工作(在C語言中,類型系統將枚舉視為int)。 可能允許對枚舉的標志值進行按位或運算。 參見http://www.velocityreviews.com/forums/t286596-enums-in-c-and-c.html
我能想到的原因之一是范圍檢查更容易。 鑒於大多數枚舉均從0開始,因此您只需要檢查上限即可。
在.NET中使用COM Interop / P / Invoke時,在某些情況下這是方便且絕對必要的。 例如,您肯定會在pinvoke.net上找到以這種方式定義的內容。 在某些情況下,它僅映射為更接近基礎API的定義,但這不是必需的,但在某些情況下,基礎API可能會將這些高位中的一些用於標志,因此將其要求是UINT。 在Interop之外,也可以僅在普通C#/ VB.NET中將一些非常高的位用作標志,並且可能還需要uint。
我正在將一些最初用C語言編寫的消息傳遞代碼轉換為C#。
C代碼中的某些字段具有一組有限的可能值,這些值定義為#define的關聯組。 換句話說是一個枚舉。
當轉換其中一些枚舉時,某些值對於整數來說太大了,例如
#定義無0x00000000
#定義VAL1 0x00000001
...
#定義VALX 0x80000000
在這里,VALX對於C#中的默認枚舉不可接受,因此該枚舉必須強制轉換為uint ,這也是記錄結構中存儲變量的類型。
我知道另一個原因,因為一位同事在這里做了。
為避免在這里 (項目2)解釋的問題,在生成枚舉列表時,他根據字符串為它提供了一個唯一值(我不記得現在是怎么回事,它不能是非唯一的哈希碼'cos )。
唯一的問題是數字有點大,所以他讓枚舉成為一個整數。
我正在談論的示例在以下代碼中: http : //www.codeplex.com/FacebookNET
看看類FacebookResponseStatus.cs
我可以給作者發送電子郵件,但我不打擾,只是根據其他經驗看看人們在一般社區中的想法。
我不會在CodePlex上使用此框架,而是對其進行了審查,以查看其他人如何將Facebook實施到.NET中。 我只是覺得這很有趣,並想知道為什么:uint代表那里的Enums。
看起來他們純粹是為這一錯誤而做,這意味着該類中可能還有更多未實現的錯誤。
/// <summary>
/// There was an HTTP error in issuing the request.
/// </summary>
HttpError = 0xFFFF0000
這樣您就可以使用按位數學將多個項目存儲到一個變量中。
例如
[Flags]
public enum SodaTypes: uint
{
None = 0b_0000_0000_0000_0000_0000_0000_0000_0000,
PepsiNormal = 0b_0000_0000_0000_0000_0000_0000_0000_0001,
DietPepsi = 0b_0000_0000_0000_0000_0000_0000_0000_0010,
Coke = 0b_0000_0000_0000_0000_0000_0000_0000_0100,
DietCoke = 0b_0000_0000_0000_0000_0000_0000_0000_1000,
.
.
.
.
Fanta = 0b_1000_0000_0000_0000_0000_0000_0000_0000
}
所以一旦你基本上可以像這樣存儲多個選項:
SodasLiked = SodaTypes.Pepsi | SodaTypes.芬達 | SodaTypes.健怡可樂;
當你打印這個時,你會得到:
Console.WriteLine(SodasLiked);
Output:
Pepsi, DietCoke,Fanta
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.