19

私は新しいプロジェクトに取り組んでいますが、正しいかどうかわからないコードがあることに気付きました。質問を示すために使用している名前と値は偽物です。

public class MyConsts //Should it be static?
{
    public const string MyConst1 = "a";
    public const string MyConst2 = "b";
    public const string MyConst3 = "c";
    public const string MyConst4 = "d";
    ....
}

私のロジックでは、このクラス (consts 値のみを含む) は静的でなければならないため、初期化するオプションはありません。これは意味がありません。正しいですか?

編集:私は盲目的にコードを書いていたので、string と const の順序を混同しました - そしてそれは私の質問の対象ではなかったので、これを修正しました。

4

5 に答える 5

35

はい、静的であることは理にかなっています。それはあなたの意図を意味し、クライアントがその型の変数を宣言することさえ防ぎます。

ただし、型部分のconstに修飾子を移動する必要があります。

public const string MyConst1 = "a";
...

値が変更される可能性がある場合は、public static readonly代わりにフィールドを使用することを検討してください。constそうしないと、定数を参照するコードに値が焼き付けられます。つまり、値が変更された場合は、クライアント コードを再構築する必要があります。

internal(別のオプションは、の代わりに定数を作成することですpublic。)

于 2013-10-30T15:54:17.533 に答える
6

はい、クラスは である必要がありますstatic。しかし、関連していますが、これらの値は実際に である必要がありconstますか?

宣言constされたものはすべて、参照アセンブリにコンパイルされるため、これがたとえばクラス ライブラリであり、これらの const 値を変更して新しいバージョンを公開した場合、それらを参照するアセンブリによって取得されません。

その特定のケースpublic static readonly stringでは理にかなっています。

ただし、それらが 1 つの特定のアセンブリ (たとえば、コンソール アプリケーションまたは WinForms アプリ) 内でのみ表示される場合は、そのクラスを宣言する必要がinternalあり、consts はそのままで問題ありません。

于 2013-10-30T15:56:39.230 に答える
2

はい、値が変更されない場合は静的にする必要があります。あなたが言うように、クライアントコードがそれをインスタンス化できるようにすることは意味がありません。

于 2013-10-30T15:54:40.407 に答える
1

sのみが含まれconst、他に何も含まれない場合は、インスタンス化や詰まりを防ぐために静的クラスにすることをお勧めします。

于 2013-10-30T15:55:48.477 に答える
0

本当に、それはあなた次第です。Static は、純粋にユーティリティ クラスの場合に便利です。

静的クラスは封印されていることに注意してください。から継承することはできません。

于 2013-10-30T15:57:54.187 に答える