2009-07-30 112 views
5

我想知道關於C#枚舉以及重複值會發生什麼。我創建了下面的小程序來測試的事情了:C#枚舉和重複值 - 危險?

namespace ConsoleTest 
{ 

    enum TestEnum 
    { 
     FirstElement = -1, 
     SecondElement, 
     ThirdElement, 
     Duplicate = FirstElement 
    } 

    /// <summary> 
    /// Summary description for MainConsole. 
    /// </summary> 
    public class MainConsole 
    { 
     /// <summary> 
     /// Constructor for the class. 
     /// </summary> 
     public MainConsole() 
     { 
      // 
      // TODO: Add constructor logic here 
      // 
     } 
     /// <summary> 
     /// Entry point for the application. 
     /// </summary> 
     /// <param name="args">Arguments to the application</param> 
     public static void Main(string[] args) 
     { 
      TestEnum first = TestEnum.FirstElement; 
      TestEnum second = TestEnum.SecondElement; 
      TestEnum duplicate = TestEnum.Duplicate; 

      foreach (string str in Enum.GetNames(typeof(TestEnum))) 
      { 
       Console.WriteLine("Name is: " + str); 
      } 

      Console.WriteLine("first string is: " + first.ToString()); 
      Console.WriteLine("value is: " + ((int)first).ToString()); 
      Console.WriteLine("second string is: " + second.ToString()); 
      Console.WriteLine("value is: " + ((int)second).ToString()); 
      Console.WriteLine("duplicate string is: " + duplicate.ToString()); 
      Console.WriteLine("value is: " + ((int)duplicate).ToString()); 

      TestEnum fromStr = (TestEnum)Enum.Parse(typeof(TestEnum), "duplicate", true); 
      Console.WriteLine("fromstr string is: " + fromStr.ToString()); 
      Console.WriteLine("value is: " + ((int)fromStr).ToString()); 
      if (fromStr == TestEnum.Duplicate) 
      { 
       Console.WriteLine("Duplicate compares the same as FirstElement"); 
      } 
      else 
      { 
       Console.WriteLine("Duplicate does NOT compare the same as FirstElement"); 
      } 

     } 
    } 
} 

將會產生以下的輸出:

Name is: SecondElement 
Name is: ThirdElement 
Name is: FirstElement 
Name is: Duplicate 
first string is: FirstElement 
value is: -1 
second string is: SecondElement 
value is: 0 
duplicate string is: FirstElement 
value is: -1 
fromstr string is: FirstElement 
value is: -1 
Duplicate compares the same as FirstElement 
Press any key to continue . . . 

這似乎是我想要什麼,並希望因爲我構建東西,一個版本標籤會每隔一段時間增加一次,所以我想要一些可以「分配」到當前版本的東西,甚至與之相比。

這裏雖然問題:什麼是這種方法的缺陷?有一個嗎?這只是不好的風格(我不想最終在達麗芙上)?有沒有更好的方式來做這樣的事情?我在.NET 2.0上,沒有選擇去3.5或4.0。

受歡迎的意見。

+0

我看到枚舉被轉換爲字符串,我看到一個字符串被解析成一個emum。你在做什麼,你做得對,但你的目標是什麼? – 2009-07-30 18:08:50

+0

@Rob Elliott - 這些東西中的一部分將進入並讀出基於字符串的數據存儲區(不是我的選擇),所以我需要確保我能夠恢復期望的結果。 – 2009-07-30 18:57:55

回答

1

它不清楚你想達到什麼目的,但它不很好看我。例如,在'Duplicate'之後向枚舉中添加另一個條目將取值0,除非您再次明確設置該值。

3

我看沒有錯,事實上,做一次同樣的事情。有時候,一個方法(特別是對於一個隨時間增長的APi的本地P/Invoke)可能採用相同的數值,但它們意味着不同的東西,所以我喜歡用一個枚舉值來描述用法。

+0

我只是做了一些類似的命令行參數。我厭倦了看到參數[2],參數[3],所以我爲參數索引創建了一個枚舉,所以我可以提供有意義的名稱。我到達這篇文章是因爲對於不同的命令開關,同一索引處的參數具有不同的含義,所以我最終不得不復制一些枚舉值。 – Triynko 2011-10-07 17:13:03

5

如果你有一個標誌枚舉,提供別名枚舉值可能很有用。例如。

[Flags] 
enum Rows { 
    Even = 0x01, 
    Odd = = 0x02, 
    All = Even | Odd 
} 

但是,如果你讀的指導方針在框架設計指南通過Cwalina和艾布拉姆斯枚舉,你會發現下面的建議:

不要使用開集枚舉(如操作系統版本,朋友的姓名等)。

請勿包括在枚舉定點值。

擁有當前版本是一個sentinel值。

這些準則是框架的設計,如果你只是想在你的應用程序在內部使用枚舉如果違反這些準則可能並不重要。但是,當其他開發人員必須使用代碼時,Microsoft創建了這些準則以避免常見的缺陷。