簡體   English   中英

將 Enum 指定為 uint 的原因是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM