web-dev-qa-db-ja.com

プログラムが使用する定数のグループを保存する最良の方法は何ですか?

私のプログラムで使用するさまざまな定数があります... stringintdoubleなど。これらを保存する最良の方法は何ですか?データがすべて同じ型ではなく、各値を手動で設定したいので、Enumが必要だとは思わない。すべてを空のクラスに保存するだけですか?または、より良い方法がありますか?

92
Matthew

おそらく、静的な読み取り専用プロパティを使用して、静的クラスにそれらを含めることができます。

public static class Routes
{
    public static string SignUp => "signup";
}
124
Daniel A. White

定数でいっぱいのクラスを使用するIMOは、定数に適しています。時々変更される場合は、代わりにconfigおよびConfigurationManagerクラスでAppSettingsを使用することをお勧めします。

実際にAppSettingsなどからプルされる「定数」がある場合、構成マネージャーからの読み取り値をラップする「定数」クラスが常にあります。上記の設定値を使用したい場所でConstants.SomeModule.Settingに直接頼る代わりに、ConfigurationManager.AppSettings["SomeModule/Setting"]を使用する方が常に有意義です。

このセットアップのボーナスポイントは、SomeModuleがConstantsファイル内のネストされたクラスである可能性が高いため、依存性注入を使用して、それに依存するクラスにSomeModuleを直接注入できます。 SomeModuleの上にインターフェイスを抽出し、消費コードでISomeModuleConfigurationに依存関係を作成することもできます。これにより、定数ファイルへの依存関係を分離でき、潜在的には特にこれらの設定がAppSettingsからのものであり、設定が環境固有であるため、構成変換を使用して変更する場合は、テストを簡単にします。

26
Chris Marisic

私がしたいことは次のことです(ただし、最後まで読んで適切なタイプの定数を使用してください):

internal static class ColumnKeys
{
    internal const string Date = "Date";
    internal const string Value = "Value";
    ...
}

これをお読みくださいconstがあなたの望むものではない理由を知るために。可能な定数のタイプは次のとおりです。

  • constフィールド。値mightが将来変更される場合は、値がハードコーディングされるため、アセンブリ(publicまたはprotected)で使用しないでください。これらの他のアセンブリのコンパイル時に。値を変更すると、再コンパイルされるまで、古い値が他のアセンブリによって使用されます。
  • static readonlyフィールド
  • staticなしのsetプロパティ
18
Marcel Gosselin

これがIMOの最良の方法です。プロパティは不要、または読み取り専用:

public static class Constants
{
   public const string SomeConstant = "Some value";
}
11
Philip Wallace

空の静的クラスが適切です。 1つの巨大なGlobals.csファイルではなく、関連する定数の適切なグループになるように、いくつかのクラスの使用を検討してください。

さらに、一部のint定数については、表記法を考慮してください。

[Flags]
enum Foo
{
}

これにより、 フラグのような値を処理する が可能になります。

4
emptyset

Web.configまたはapp.configを使用する別の投票。構成ファイルは、接続文字列などの定数に適した場所です。これらのタイプの項目を表示または変更するためにソースを見る必要はありません。これらの定数を.configファイルから読み取る静的クラスは、アプリケーションがこれらのリソースにコードで定義されているかのようにアクセスできるようにする一方で、簡単に表示/編集できる柔軟性を提供するため、適切な妥協案となる可能性がありますスペース。

3
3Dave

はい、static classは、特定の型に関連する定数を除き、定数を格納するのに十分です。

1
bruno conde

これらの定数がアプリケーションの動作に影響するサービス参照またはスイッチである場合、アプリケーションユーザー設定として設定します。そのように変更する必要がある場合は、再コンパイルする必要はなく、静的プロパティクラスを介してそれらを参照できます。

Properties.Settings.Default.ServiceRef
0
Aaron

静的読み取り専用の静的クラスをお勧めします。以下のコードスニペットを見つけてください。

  public static class CachedKeysManager
    {
        public static readonly string DistributorList = "distributorList";
    }
0
KAPIL SHARMA