10

数値の代わりに文字列値を含む列挙型のようなクラスを作成する方法に関するベストプラクティスを探しています。このようなもの:

public static class CustomerType
{
  public static string Type1 = "Customer Type 1";
  public static string Type2 = "Customer Type 2";
}

このクラスは、CustomerTypeが必要なすべての場合の値として、アプリケーション全体で使用します。これはレガシーシステムであり、このような値はどこにでもハードコーディングされているため、列挙型を使用できません。私はそれらを1か所に集中させようとしています。

質問は、上記の例では、変数を宣言するために使用する必要があります:

  1. 静的読み取り専用キーワード
  2. constキーワード
  3. または単に静的

これらの種類のクラスと値を設定するためのベストプラクティスは何でしょうか?

4

2 に答える 2

13

フィールドが不注意に変更され、不可解な破損が発生する可能性があるため、plain は使用しないでください。staticしたがって、2 つの選択肢はstatic readonlyconstです。

constコンパイル時に変数の値が呼び出しコードに埋め込まれます。これは、古いハードコードされたコードと実質的に同等です (ただし、記号定数の利点があります)。の危険性は、 が変更されconstた場合にすべてを再コンパイルする必要があることです。これconstにより、非同期の定数やトリッキーなバグが発生しないようにすることができます。

static readonly通常のフィールド アクセスになるため、同期の問題は発生しません。ただし、余分なフィールドへのアクセスが原因で、パフォーマンスがわずかに低下する可能性があります (パフォーマンスが重要なコードでこれらのフィールドを頻繁に使用しない限り、気付かない可能性があります)。将来のある時点で文字列を変更する必要があると思われる場合は、 を使用することをお勧めしますstatic readonly

constその音から、安全な賭けであるほど値が変化することはめったにありません。ただし、最終的な決定はあなた次第です。

于 2013-02-19T07:07:03.113 に答える
3

C# を使用している場合は、列挙型を作成し、以下の値にstring基づいて設定してみませんか。Description attributeenum

public enum CustomerType
{
    [System.ComponentModel.Description("Customer Type 1")]
    Type1,

    [System.ComponentModelDescription("Customer Type 2")]
    Type2
}

Description次に、以下のように列挙値の値を取得できます。

int value = CustermType.Type1;
string type1Description = Enums.GetDescription((CustomerType)value);

列挙型の属性値を取得するその他のさまざまな方法については、このSO QADescriptionを参照してください。

于 2013-02-19T07:22:51.143 に答える