簡體   English   中英

在有點枚舉上覆蓋int

[英]Overriding int on a bit enum

我看到了一些.NET 2.0代碼,如下所示:

 public enum abc : int
 {
  value1 = 1,
  value2 = 2,
  value3 = 4
 }

等等...

現在,我知道標志枚舉可用於位值(如上面的,對吧?),因此您可以| “或”&等,但是不使用它的原因是什么? 覆蓋int有什么意義?

如果我設計一個用於選擇多個值的枚舉,則將使用flags屬性而不覆蓋任何內容(我不理解的內容)。 上面的方法有什么用?

謝謝

它不是“覆蓋” int ,而是指示枚舉所基於的類型。 默認值為int因此實際上並沒有實現任何目的,但是在某些情況下,如果枚舉周圍有很多實例,並且您可能希望將枚舉基於long來存儲更多標志,或者以byte為基礎以節省空間具有一些值,但是框架設計指南中的建議是使用int除非您有很好的理由不這樣做。

如果打算將其用作標志枚舉,則應將其標記為[Flags] ,這似乎是這里的意圖,因此省略看起來像是一個錯誤。 即使未用[Flags]標記,您仍然可以使用按位運算符組合值,但是從內存中,我認為您會收到編譯器警告(或者可能是FxCop警告,也可能是ReSharper警告...) 。

“:int”指定用作枚舉值的基礎類型的內容; 此處可以使用除char以外的任何整數類型。 默認值為int,因此在這種情況下是多余的。

FlagsAttribute僅告訴用戶該枚舉中的字段可以合並; 它實際上並沒有將枚舉的字段設置為“可標記”值。 這將需要您自己做,就像已經做過一樣。

我看不出任何好處。 程序員方面可能缺乏經驗。

如果您要詢問選擇特定值的情況,我不知道有什么好的例子,但我可以想象

enum Color = {
  Red = 0xFF0000,
  Green = 0x00FF00,
  Blue = 0x0000FF }

也許有用。

僅出於使用1-hot編碼的目的,將非Flags枚舉上的值設置為使用1-hot編碼實際上沒有任何意義。 我想如果您認為將來可以將其設為Flags枚舉可能很有意義。 否則,不應覆蓋這些值或根據其含義分配一個值(例如Color.Red = 0xFF0000)。

關於指定基礎類型的“:int”,如果看到的話,我將環顧四周,看看它們是否以這種方式刪除所有枚舉。 如果是這樣,他們可能只是學會了以這種方式編寫枚舉(或者他們是一個超外顯的編碼器)。 但是,如果只是以這種方式聲明了這個枚舉,則可能是程序員試圖說出某些話(最好用注釋來說明),這必須具有底層的“ int”類型。 也許它正在某個地方進行二進制序列化或反序列化。

至於[Flags]屬性,就C#而言,您可以在任何枚舉上使用按位運算符,而不僅僅是用[Flags]聲明的那些。 從上面的示例中,沒有任何[標記],以下內容完全合法:

abc myAbcValue = value1 | 值2;

關於[Flags]的主要區別在於Enum的ToString()和Parse()方法。 如果沒有[Flags],myAbvValue.ToString()將返回“ 3”,但是如果有[Flags],它將返回“ value1,value2”。 同樣地,使用[標志]

abc yourAbcValue =(abc)Enum.Parse(typeof(abc),“ value1,value2”);

會將yourAbcValue的基礎值設置為3。

請注意,Enum()的IsDefined()方法不允許帶有[Flags]枚舉的多個值,因此:

Enum.IsDefined(typeof(abc),“ value1,value2”)

無論是否使用[Flags],都將返回false。

還要注意,[Flags]提供有關任何反射訪問的信息,其他語言可能會將標記的枚舉的限制與正常枚舉不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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