2009-07-30 12 views
5

私はC#列挙型について疑問を抱いていました。C#列挙型と重複値 - 危険?

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 . . . 

これは私がしたい正確に何も、私は何かを構築していますので、そのバージョンを期待しているようだ:次の出力を生成し

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"); 
      } 

     } 
    } 
} 

:私は物事をテストするには、以下の小さなプログラムを作成しましたタグが頻繁に増加するので、私は現在のバージョンに "割り当てる"ことができ、それを比較することもできます。

ここに質問があります:このアプローチの落とし穴は何ですか? 1つはありますか?それはちょうど悪いスタイルですか(私はthedailywtfに終わることを望んでいません)?このようなことをするより良い方法がありますか?私は.NET 2.0を使用しており、3.5または4.0に移行するオプションはありません。

意見は歓迎します。

+0

enumが文字列に変換されているのが見えますが、文字列がemumに解析されています。あなたは何をしていますか、あなたは正しくやっていますが、あなたの目標は何ですか? –

+0

@Rob Elliott - これらのものの中には、文字列ベースのデータストア(私の選択ではない)に出入りするものがあるので、私が期待しているものを返すようにする必要があります。 –

答えて

1

あなたが達成しようとしていることは明確ではありませんが、それは私にはうまくありません。 「重複」の後に別のエントリを列挙型に追加すると、明示的に値を再設定しない限り、値は0になります。

+0

私はこれを試して、あなたは絶対に正しいです。値を正しくグループ化しないと、これは非常に危険です。 –

3

私はそれに間違いがないことを見て、実際には機会に同じことをします。メソッド(特に時間が経つにつれて成長したAPiへのネイティブP/Invoke)が同じ数値を取るかもしれませんが、それらは異なる何かを意味するので、私は使用法を記述する列挙値の名前を持っています。

+0

私はちょうどコマンドライン引数と同様の何かをしました。私はargs [2]、args [3]を見てうんざりしていましたので、引数索引の列挙を作成しましたので、意味のある名前を付けることができました。私はこのポストに到着しました。異なるコマンドスイッチのために、同じインデックスの引数が異なる意味を持っていたので、いくつかの列挙型値を複製する必要がありました。 – Triynko

5

エイリアスフラグを設定するとエイリアス値を指定すると便利です。例えば。

は(オープンセットのために列挙型を使用しないでください:あなたはCwalinaとエイブラムスによるFrameworkの設計ガイドラインに列挙するためのガイドラインを読めば

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

ただし、以下のアドバイスを見つけるだろうオペレーティングシステムのバージョン、お友達の名前など)。

列挙型での番兵は含まれていませください。

現在のバージョンがの場合は、センチネル値です。

これらのガイドラインはフレームワーク設計のためのものであり、単にアプリケーション内で列挙型を使用する場合は、これらのガイドラインを破っても関係ありません。しかし、マイクロソフトは、他の開発者がコードを使用する必要がある場合に、一般的な落とし穴を避けるために、このガイドラインを作成しました。