web-dev-qa-db-ja.com

列挙と定数。いつ使用しますか?

列挙型を読んでいたところ、定数を宣言するのと非常によく似ていました。列挙型ではなく定数を使用する場合、またはその逆の場合をどのように知ることができますか?列挙型を使用する利点は何ですか?

86
Draco

何かできる値の範囲を定義する場合は、enumを使用します。色は次のような明らかな例です。

public enum Colour
{
    White,
    Red,
    Blue
}

または、次のような可能性のあるもののセットかもしれません:(例: here から盗みました)

[FlagsAttribute]
enum DistributedChannel
{
  None = 0,
  Transacted = 1,
  Queued = 2,
  Encrypted = 4,
  Persisted = 16,
  FaultTolerant = Transacted | Queued | Persisted
}

PIのように、定数は単一の値用でなければなりません。 PI値の範囲はなく、PIだけがあります。

84
Andrew Barrett

他の答えから欠けているのは、列挙型が整数の基本型を持っているということです。デフォルトをintからchar以外の他の整数型に変更できます:

enum LongEnum : long {
    foo,
    bar,
}

ベースタイプから明示的にキャストすることも、暗黙的にベースタイプにキャストすることもできます。これはスイッチステートメントで役立ちます。列挙型に適切な値を持つメンバーがない場合でも、基本型の任意の値を列挙型にキャストできることに注意してください。そのため、常にスイッチのデフォルトセクションを使用することをお勧めします。ところで、.NET自体は浮動小数点値の列挙も許可しますが、C#で定義することはできませんが、まだ使用できると思います(スイッチを除く)。

さらに、列挙型を使用すると、型の安全性が高まります。使用する場合メソッドパラメータとしてint定数を使用すると、任意のint値でメソッドを呼び出すことができます。確かに、キャストを介して列挙型でも発生する可能性がありますが、偶然に発生することはありません。さらに悪いことに、パラメータの順序を混同する可能性があります。

void method(int a, int b) {...}

定数Aのみがaに入り、定数Bのみがbに入る場合、2つの異なる列挙型を使用すると、コンパイル中の誤用が明らかになります。

27
Johannes

定数は、enumが特定の型である場合、変数が値を変更しないことを示す言語機能です(したがって、コンパイラーはその知識に基づいて最適化を行うことができます)。

定数には任意のデータ型を使用できますが、enumはenumです。

列挙型は、多くのオプションがあり、コードの読みやすさを改善したい場所で使用します。つまり、トレースレベルは、0、1、2の値を持つintとして、またはエラー、警告、情報などの列挙型として持つことができます。

列挙型には、ビットごとの演算子として使用する機能もあります。つまり、FontStyle.Bold | FontStyle.Italicは、太字と斜体のフォントを提供します。

20
Robert MacLean

ロバートの答えに加えて:

  1. 名前付き値の有限セットに列挙を使用します。各シンボルの背後にある数値を実際に気にする必要はありません(ただし、たとえばレガシーシステムとの互換性のために、それらを強制することができます)。

  2. Robert:はい、Enumはビットフィールドとして使用できます。 Flags 属性を使用します(enumのメンバーに適切な数値があることを確認します)。

8
Serge Wautier

C#定数は、定義された名前を値に与えるという点で変数に似ています。ただし、定数は、いったん定義されると定数に割り当てられた値を変更できないため、標準変数とは異なります。定数の主な利点は、自己文書化コードの作成と、単一の場所でのキー値の宣言を可能にすることです。これにより、値を更新してソフトウェアを再コンパイルする必要がある場合のメンテナンスが容易になります。

一方、列挙子リストは、シーケンスと状態を定義するのに役立ちます。特に、それらの状態が自然に進行する場合に役立ちます。これは、リスト内の各定数は、名前または値を使用してフォーマットおよび比較できるためです。列挙を使用して、有効な値の限定されたセットを定義することもできます。

3
simplyharsh

enumの代わりにconstを使用するときに便利なことの1つは、enumの値を反復処理できることです。これは、const値を使用して行うのがはるかに困難です。

2
Backwards_Dave